2013-07-12 7 views
6

wirkt wie ein Zauber:Warum muss UpdateView model/querieset/get_queryset definiert haben, wenn form_class im Gegensatz zu CreateView verwendet wird?

MyCreateView(CreateView): 
    template_name = "my_template_name" 
    form_class = MyModelForm 
    success_url = "/success/" 

Aber die folgenden nicht:

MyUpdateView(UpdateView): 
    template_name = "my_template_name" 
    form_class = MyModelForm 
    success_url = "/success/" 

ich diesen Fehler:

MyUpdateView is missing a queryset. Define MyUpdateView.model, MyUpdateView.queryset, or override MyUpdateView.get_queryset(). 

Warum ein UpdateView Bedarf model, queryset oder get_queryset definiert, um keinen Fehler zu verursachen, während CreateView nicht funktioniert? Sollte es nicht automatisch aus dem Model in der ModelForm abgeleitet werden?

Antwort

7

Derzeit (Django 1.5.1 offizielle Version) UpdateView ruft self.get_object(), um instance Objekt zu Form zu liefern.

Von https://github.com/django/django/blob/1.5c2/django/views/generic/edit.py#L217:

def get(self, request, *args, **kwargs): 
    self.object = self.get_object() 
    return super(BaseUpdateView, self).get(request, *args, **kwargs) 

def post(self, request, *args, **kwargs): 
    self.object = self.get_object() 
    return super(BaseUpdateView, self).post(request, *args, **kwargs) 

Und self.get_object Methode muss eine dieser Eigenschaften erklärt: model, queryset oder get_queryset

Während CreateView nicht self.get_object() nennen.

Von https://github.com/django/django/blob/1.5c2/django/views/generic/edit.py#L194:

def get(self, request, *args, **kwargs): 
    self.object = None 
    return super(BaseCreateView, self).get(request, *args, **kwargs) 

def post(self, request, *args, **kwargs): 
    self.object = None 
    return super(BaseCreateView, self).post(request, *args, **kwargs) 
2

Sie könnten ein Problem in Ihrer urls.py-Datei haben.

Was ich glaube, du darin geschrieben ist:

url(r'foldername/(?P[0-9]+)/$', views.UpdateView.as_view(), name='update'),

aber Sie haben UpdateView zu MyUpdateView ändern, wie folgt aus: url(r'foldername/(?P[0-9]+)/$', views.MyUpdateView.as_view(), name='update'),

Verwandte Themen