4

SOと同じように、djangoアプリのURLにナメクジを追加しようとしています。

現在、次のようなURLで問題なく機能するページがあります。

http://example.com/foo/123/

次のような「slugified」URLを追加したいと思います。

http://example.com/foo/123/foo-name-here

urlconfを変更し、ビュー関数に使い捨ての値を追加するだけで、問題なく動作させることができます。

#urls.py

ulpatterns = patterns('project.app.views',
    url(r'^foo/(?P<foo_id>\d+)/(?P<name_slug>\w+)/$', 'foo_detail', name='foo_detail'),
)

#views.py:

def foo_detail(request, foo_id, name_slug):
    # stuff here, name slug is just discarded

スラッグでURLを確認することは問題なく機能します。

ただし、私の問題は、を使用しているときです@models.permalink

私のFooモデルでは、以前は次のものがありましたが、これは問題なく機能しました。

@models.permalink
def get_absolute_url(self):
    return ('foo_detail', [str(self.id),])

ただし、変更後、{{ foo.get_absolute_url }}テンプレートを呼び出すと、結果は常に空の文字列になります。

の次の2つの置換を試しましたがget_absolute_url、どちらも機能していません。

from django.template.defaultfilters import slugify

# attempt 1
@models.permalink
def get_absolute_url(self):
    return ('foo_detail', [str(self.id), slugify(self.name)])

# attempt 2
@models.permalink
def get_absolute_url(self):
    return ('foo_detail', (), {
        'foo_id': str(self.id), 
        'name_slug': slugify(self.name),
    })

戻る前にaを追加するprint slugify(self.name)と、slugifiedの名前がコンソールに正常に表示されることに注意してください。

テンプレートを呼び出す{{ foo.get_absolute_url }}と、結果は常に空の文字列になり、エラーは発生しません。

メソッドをに置き換えることができることはわかってreturn '/foo/%s/%s' % (str(self.id), slugify(self.name))いますが、パーマリンクを機能させて、URLが1か所でのみ定義されるようにしようとしています。私は何が間違っているのですか?

4

1 に答える 1

7

私もこの問題に遭遇したので、確認することが1つあります。

(?P<name_slug>\w+)

slugifyはどこかにハイフンを追加していますか?その場合、正規表現が一致しない場合、ハイフンは単語以外の文字です。使用法などを修正するため[\w-]+

于 2009-10-15T01:40:24.880 に答える