2013-07-12 11 views
6

działa jak czar:Dlaczego UpdateView musi mieć model/queryset/get_queryset zdefiniowany podczas korzystania z klasy form_klasa w przeciwieństwie do CreateView?

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

Ale Następujące nie:

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

otrzymuję ten błąd:

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

Dlaczego UpdateView potrzeba model, queryset lub get_queryset zdefiniowany tak, aby nie powodował błędu, podczas gdy CreateView nie? Nie powinien być w stanie automatycznie czerpać go z Modelu używanego w ModelForm?

Odpowiedz

7

Obecnie (oficjalne wydanie django 1.5.1) dzwoni pod numer self.get_object(), aby móc dostarczyć obiekt instance do formularza.

Od 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) 

I self.get_object metoda wymaga jednego z tych właściwości oświadczył: model, queryset lub get_queryset

Zważywszy CreateView nie nazywają self.get_object().

Od 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

Możesz mieć problem w pliku urls.py.

Co myślę, że napisał w niej jest:

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

ale trzeba zmienić UpdateView do MyUpdateView, tak: url(r'foldername/(?P[0-9]+)/$', views.MyUpdateView.as_view(), name='update'),

Powiązane problemy