Why does UpdateView need to have model/queryset/get_queryset defined when using form_class as opposed to CreateView?

非 Y 不嫁゛ 提交于 2019-12-07 03:47:48

问题


Works like a charm:

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

But the following doesn't:

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

I get this error:

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

Why does an UpdateView need model, queryset or get_queryset defined to not cause an error while CreateView doesn't? Shouldn't it be able to automatically derive it from the Model used in the ModelForm?


回答1:


Currently (django 1.5.1 official release) UpdateView is calling self.get_object() to be able to provide instance object to Form.

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

And self.get_object method needs one of this properties declared: model, queryset or get_queryset

Whereas CreateView don't call self.get_object().

From 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:


You might have a problem in your urls.py file.

What I think you wrote in it is:

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

but you have to change UpdateView to MyUpdateView, like this: url(r'foldername/(?P[0-9]+)/$', views.MyUpdateView.as_view(), name='update'),



来源:https://stackoverflow.com/questions/17613398/why-does-updateview-need-to-have-model-queryset-get-queryset-defined-when-using

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!