使用get_absolute_url()时的NoReverseMatch

时间:2012-02-21 16:05:08

标签: django django-models

模型:

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 =“A B”,这是错误的:

NoReverseMatch:反向'thu',参数'()'和关键字参数'{'B_Name':u'A B'}'找不到。

2 个答案:

答案 0 :(得分:2)

当然。你的网址是:

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

[-\w]+表示“任何非空格字符或' - '一次或多次”。你已明确告诉它不接受空格,所以它没有。

只需用[-\w ]+替换正则表达式(注意结束括号前的空格),它就可以了。但是,在URL中包含空格确实不是一个好主意。

答案 1 :(得分:1)

您的名为thu的网址不允许B_Name参数中的空格。它应该是

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

请注意[-\w ]中的空格。

通常为您的模型创建一个不包含任何空格的slug field,并在您的网址中使用它。