1

urls.py

url(r'^customer/(?P<name>[^\s]+)/$', customerDetailView.as_view(), name="customerDetailView"), #pass 'name' variable

ビュー.py

class customerDetailView(DetailView):
    context_object_name = 'customerDetail'
    template_name = "customer.html"
    allow_empty = True

    def __init__(self, name=None, *args):
        self.name = name # name is 'None'... Why...?

    def get_queryset(self):
        return Customer.objects.get(name=self.name)

「192.168.1.5/customer/abc/」をリクエストするだけですが、「名前」はありません...

「名前」を受け取るには?私は何をすべきか?

編集 - - -

ビュー.py

class customerDetailView(DetailView):
    context_object_name = 'customerDetail'
    template_name = "customer.html"
    allow_empty = True
    """
    def __init__(self, **kwargs):
        import pdb;pdb.set_trace()
        self.name = kwargs['name']
    """
    def get_queryset(self):
        # import pdb;pdb.set_trace()
        self.name = self.kwargs['name'] # Thanks  Kay Zhu!!
        return Customer.objects.get(name=self.name)

あなたが答えたコードを適用します。

次に、エラーが発生します

Generic detail view customerDetailView must be called with either an object pk or a slug.

だから私は「pk」が必要です...

私は何をすべきか?

4

1 に答える 1

1

でパラメータにアクセスできるはずですself.kwargs['name']。さらに、get_queryset代わりにクエリセットを返す必要があります。

汎用ビューを使用する場合は、URLpkの代わりにを使用する必要もあります。その後は、クラスで定義するだけで、機能するはずです。アクセスする必要はまったくありません。[ソース]nameDetailViewmodel = Customerslug_field = 'name'customerDetailViewself.kwargs['name']

本当にURLで使用したい場合は、 (に加えて:に加えて)に変更する<name>必要もあります。slug_url_kwargnameslug_field = 'name'

class customerDetailView(DetailView):
    context_object_name = 'customerDetail'
    template_name = "customer.html"
    allow_empty = True
    model = Customer
    slug_field = 'name'
    slug_url_kwarg = 'name'
    # no need to override any methods here

または次のようにオーバーライドget_objectします。

def get_object(self):
    return get_object_or_404(Customer, name=self.kwargs['name'])

slug_field変更せずslug_url_kwargに、クラスで。

于 2013-02-09T11:26:20.473 に答える