为什么在使用form_class而不是CreateView时,UpdateView需要定义model/queryset/get_queryset?

Ben*_*ey4 6 django django-class-based-views

奇迹般有效:

MyCreateView(CreateView):
    template_name = "my_template_name"
    form_class = MyModelForm
    success_url = "/success/"
Run Code Online (Sandbox Code Playgroud)

但以下不是:

MyUpdateView(UpdateView):
    template_name = "my_template_name"
    form_class = MyModelForm
    success_url = "/success/"
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

MyUpdateView is missing a queryset. Define MyUpdateView.model, MyUpdateView.queryset, or override MyUpdateView.get_queryset().
Run Code Online (Sandbox Code Playgroud)

为什么UpdateView需要model,queryset或者get_queryset定义为不会导致错误而CreateView不是?它不应该能够从ModelForm中使用的模型中自动导出它吗?

sta*_*alk 8

目前(django 1.5.1正式发布)UpdateView正在调用self.get_object()能够instance向Form 提供对象.

来自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)
Run Code Online (Sandbox Code Playgroud)

并且self.get_object方法需要声明此属性之一:model,querysetget_queryset

虽然CreateView不叫self.get_object().

来自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)
Run Code Online (Sandbox Code Playgroud)