2
  • URLConf:

    url(r'^body/(?P<id>\d+)/$', 'body_part_detail', name='body-part-detail'),
    url(r'^body/(?P<id>\d+)/(?P<slug>[-\w\d]+)/$', 'body_part_detail', name='body-part-detail'),
    
  • get_absolute_url()実装:

    def get_absolute_url(self):
        kwargs = {
            'id' : self.id,
            'slug' : slugify(self.name)
        }
    
        return reverse('body-part-detail', kwargs=kwargs)
    

今、私は2つurlの場所を持ってname=body-part-detailいます(これは間違っているかもしれませんか?)。それでも、 2番目を使用し、スラッグコンポーネントで目的のURLを返すreverseという意味で成功します。urlなぜこれが機能するのですか?この場合、私はただ「幸運」ですか(プログラムは幸運であってはならないので引用します!)?

最後に、SOとWebには、キーワードargurlを共有するsを使用したURLConfsの例を示す場所がいくつかあります。nameたとえば、Visgean Skeloruの答えは次のとおりです。djangoのオプションのgetパラメータ?。これは間違っていますか/悪いですか?

4

2 に答える 2

4

このreverse関数は、kwargsidslugパターン名があることを識別しbody-part-detail、それらのkwargsとその名前に対応する唯一のURLを返します。あなたは幸運ではありません、それreverseはそうするように設計されていることです。

多くのパターンに同じ名前を使用できるかもしれませんが、それが機能するように設計されているとは思いません(重複がないことを確認するためのチェックの実装を提案する非常に古いバグチケットを見ることができます)。パターンごとに一意の名前を使用すると、アプリのメンテナンスが簡単になると思います。詳細については、ドキュメントをご覧ください。

于 2013-02-05T19:51:34.863 に答える
3

あなたのreverse()呼び出しでは、2つの引数を渡しています。そのため、Djangoは、最初のURLと一致させることができないことを発見します。これは、名前は正しいものの、そのURLにはURLパラメーターが1つしかないためです。したがって、Djangoは必然的にそれを2番目のURLと一致させます。

オプションのURLパターンは問題ありませんが、各URLに一意の名前を付け、それを使用してURLを逆にするのが最善です。これにより、URLを解決する際のあいまいさがなくなり、自分自身や他の開発者がコードを理解しやすくなります。

于 2013-02-05T19:50:47.430 に答える