2012-02-21 10 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'), 

ビュー:私はB_Name = "AB" を使用している場合

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"を使用するとエラーです:

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

thuという名前のURLは、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]+「とは、任意の非空白文字または 『 - 』 1回以上」を意味します。あなたは明示的にスペースを受け入れないように言いました。そうではありません。

ちょうどその正規表現を[-\w ]+のように置き換えてください(閉じ括弧の前にスペースがあることに気づきます)。ただし、URLにスペースを含めることは実際的ではありません。

+0

ありがとう、私は理解しています – rocky

関連する問題