2012-02-21 88 views
0

型號:NoReverseMatch使用時get_absolute_url()

class Band(models.Model): 
B_Name = models.CharField(max_length=30, primary_key=True) 
Country = models.CharField(max_length=30) 
genre = models.ForeignKey(Genre) 
imageband = models.ImageField(upload_to='images/band') 

def __unicode__(self): 
    return self.B_Name 

@models.permalink 
def get_absolute_url(self): 
    return ('thu',(), { 
     'B_Name': self.B_Name}) 

網址:

url(r'^genre/(\d+)/$', 'genre', name="genre"), 
url(r'^thu/(?P<B_Name>[-\w]+)/$', 'thu', name='thu'), 

觀點:

def genre(request, url): 
    template = 'genre/genre.html' 
    if url=='1': 
     tmp = Band.objects.raw('SELECT B_Name, Country FROM data_band WHERE genre_id=%s', ...) 
    if .... 
    return render_to_response(template,{'tmp':tmp}) 


def thu(request): 
     template = 'genre/thu.html' 
     tmp = Band.objects.raw('SELECT B_Name, genre FROM data_band') 
     return render_to_response(template,{'tmp':tmp}) 

如果我使用B_Name = 「AB」,它的工作,但我使用B_Name =「AB」,它的錯誤:

NoReverseMatch:Reverse for 'thu'帶有參數'()'和關鍵字參數'{'B_Name':''B'}'找不到。

+3

爲什麼使用'raw'查詢而不是標準'filter'調用? – 2012-02-21 16:20:29

+0

這是我的習慣,濾波器和原始信號有什麼不同? – rocky 2012-02-21 16:45:18

+2

@skidrow:即'filter'使用了與數據庫無關的Django DBAPI,而'raw'則直接查詢數據庫,因此它本質上依賴於此時應用程序正在使用的特定數據庫。如果您需要切換到不同的數據庫平臺,則任何或所有「原始」查詢都可能中斷。另外,使用'filter'(和其他的DBAPI)可以讓你的代碼更具可讀性,更易於維護。作爲一般規則,「原始」僅適用於「其他方式無法做到」的情況。 – 2012-02-21 17:35:51

回答

1

您的名爲thu的網址在B_Name參數中不允許有空格。它應該是

url(r'^thu/(?P<B_Name>[-\w ]+)/$', 'thu', name='thu'), 

注意在[-\w ]的空間。

通常爲您的模型創建一個不包含任何空格的slug field,並在您的網址中使用它。

+0

非常感謝你 – rocky 2012-02-21 16:49:44

2

當然。您URLPATTERN是:

url(r'^thu/(?P<B_Name>[-\w]+)/$', 'thu', name='thu'), 

[-\w]+意味着 「任何非空格字符或 ' - ' 一次或多次」。你明確地告訴它不接受一個空間,所以它不會。

只需用[-\w ]+(注意右括號之前的空格)代替那個正則表達式,它就可以工作。但是,在URL中包含空格並不是一個好主意。

+0

謝謝,我明白 – rocky 2012-02-21 16:59:51