/ / django: Wie wird die Variable an die Klasse übergeben? - Django, Python-2.7, Python-2.x, Django-Generic-Ansichten, Django-1.4

django: Wie wird die Variable an die Klasse übergeben? - Django, Python-2.7, Python-2.x, Django-Generic-Ansichten, Django-1.4

urls.py

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

und

views.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)

Ich frage nur "192.168.1.5/customer/abc/", aber "name" ist keine ...

Wie erhält man "Name"? Was soll ich machen?

bearbeiten-----

views.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)

Ich wende Code an, den Sie beantwortet haben.

Dann erhalte ich einen Fehler

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

Also brauche ich "PK" ...

Was soll ich machen?

Antworten:

1 für die Antwort № 1

Sie sollten auf den Parameter mit zugreifen können self.kwargs["name"]. Des Weiteren, get_queryset sollte stattdessen ein Abfrage-Set zurückgeben.

Sie müssen auch verwenden pk Anstatt von name in Ihrer URL, wenn Sie verwenden möchten DetailView allgemeine Ansicht. Danach müssen Sie nur definieren model = Customer und slug_field = "name" in deinem customerDetailView Klasse und es sollte funktionieren. Sie müssen nicht darauf zugreifen self.kwargs["name"] überhaupt. [Quelle]

Wenn du Ja wirklich Möchte benutzen <name> In Ihrer URL müssen Sie auch ändern slug_url_kwarg zu name (zusätzlich zu slug_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

oder überschreiben get_object durch:

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

ohne zu modifizieren slug_field und slug_url_kwarg in deiner Klasse.