【问题标题】:Why does UpdateView need to have model/queryset/get_queryset defined when using form_class as opposed to CreateView?为什么在使用 form_class 而不是 CreateView 时 UpdateView 需要定义 model/queryset/get_queryset?
【发布时间】:2013-07-10 21:45:38
【问题描述】:

像魅力一样工作:

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

但以下不是:

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

我收到此错误:

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

为什么UpdateView 需要将modelquerysetget_queryset 定义为不会导致错误,而CreateView 不需要?是不是应该能够从ModelForm中使用的Model自动派生出来?

【问题讨论】:

    标签: django django-class-based-views


    【解决方案1】:

    您的 urls.py 文件可能有问题。

    我认为你在里面写的是:

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

    但您必须将 UpdateView 更改为 MyUpdateView,如下所示: url(r'foldername/(?P[0-9]+)/$', views.MyUpdateView.as_view(), name='update'),

    【讨论】:

      【解决方案2】:

      目前(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)
      

      self.get_object 方法需要声明以下属性之一:modelquerysetget_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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-26
        • 1970-01-01
        • 2018-07-11
        • 2012-07-19
        • 2013-07-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多