4

私はこれが本当に簡単であることを知っていますが、何かが欠けています。そして、私はこれを思い出すことができないので、これがここに解決策を文書化できることを願っています.

私がやりたいことは、URL でオブジェクトの PK を渡し、詳細ビューを取得することだけです。

URL:

    url(regex=r'^(?P<pk>\d+)/$',
    view=AdventureDetail.as_view(),
    name='adventure_detail',
),

意見:

class AdventureDetail(DetailView):
""" Get a time entry detail view """

    template_name = "adventure/AdventureDetail.html"

    def get_object(self):
        return get_object_or_404(Page)

しかし、「複数のオブジェクトがエラーを返しました」というメッセージが表示されます

MultipleObjectsReturned at /1/ get() は複数のページを返しました -- 5 を返しました! ルックアップ パラメータは {} でした

これは本当にばかげていると感じます。それは「うまくいく」はずですが、明らかな何かが欠けています。

助けてくれてありがとう。

4

3 に答える 3

6

DetailView では、より単純です: モデルを指定するだけです:

class AdventureDetail(DetailView):
""" Get a time entry detail view """

    model = Page
    template_name = "adventure/AdventureDetail.html"

それだけです。DetailView が残りの作業を行います。

もう 1 つの方法は、クエリセットを指定することです。

class AdventureDetail(DetailView):
""" Get a time entry detail view """

    queryset = Page.objects.all()
    template_name = "adventure/AdventureDetail.html"

これは同じ結果になります。

最後の方法は、メソッドをオーバーライドするget_objectことです。

詳細はこちら

于 2013-04-28T22:28:26.503 に答える
3

クラスget_object_or_404以外に、他のパラメーターを渡していません。Pageつまり、基本的にすべてのページに対してクエリを実行しています。したがって、次のことを行う必要があります。

return get_object_or_404(Page, pk=self.kwargs.get('pk', None))

また、なぜオーバーライドしているのget_objectですか? にはDetailViewすでにこの機能が含まれているため、URL を含めるだけで済みますpk

于 2013-04-28T22:23:38.727 に答える