2012-02-21 3 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을 :

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': u'A B '}'이 (가) 없습니다.

+3

왜 표준'filter' 호출보다는'raw' 쿼리를 사용하고 있습니까? –

+0

내 습관이야, 필터와 원료가 다른거야? – rocky

+2

@skidrow :'filter'는 데이터베이스에 독립적 인 Django DBAPI를 사용하는 반면,'raw'는 데이터베이스를 직접 쿼리하기 때문에, 현재이 순간에 앱이 사용하는 특정 데이터베이스에 본질적으로 의존합니다 . 다른 DB 플랫폼으로 전환해야한다면,'raw' 쿼리의 일부 또는 전부가 중단 될 수 있습니다. 또한'filter' (및 나머지 DBAPI)를 사용하면 코드를보다 읽기 쉽고 유지 보수하기가 쉬워집니다. 일반적으로 '원시'는 '그 밖의 아무것도하지 않음'시나리오에만 해당됩니다. –

답변

1

URL이 thu 인 경우 B_Name 매개 변수에 공백이 허용되지 않습니다. 그것은이어야합니다

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

[-\w ]에주의하십시오.

공백이없는 모델에 slug field을 작성하고 URL에 사용하는 것이 일반적입니다.

+0

고마워요. – rocky

2

물론. 귀하의 URLPATTERN은 다음과 같습니다

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

[-\w]+는 "어떤 비 공간 문자 또는 '-'한 번 이상"을 의미한다. 당신은 명시 적으로 공간을 받아들이지 않겠다고 말했기 때문에 그렇지 않습니다.

방금 ​​정규식을 [-\w ]+ (닫는 대괄호 앞에 공백을 알 수 있습니다.)으로 바꾸면 제대로 작동합니다. 그러나 URL에 공백을 포함하는 것은 좋지 않습니다.

+0

감사합니다. 이해합니다. – rocky

관련 문제