【问题标题】:Django - get_context_data() missing 1 required positional argument: 'form'Django - get_context_data() 缺少 1 个必需的位置参数:'form'
【发布时间】:2020-09-08 15:44:32
【问题描述】:

我正在尝试将 inlineformset 添加到 Django 博客项目。我收到了帖子,我想通过基于类的视图将多个图像添加到帖子中。但是当我尝试 get_context_data 时,我收到了这个错误:

get_context_data() 缺少 1 个必需的位置参数:'form'

模型.py:

class Post(models.Model):
    title = models.CharField(max_length=100)
    content = RichTextField(blank=True, null=True)

class PostImage(models.Model):
    post = models.ForeignKey(Post, default=None, on_delete=models.CASCADE)
    image = models.ImageField(upload_to='gallery/')
    description = models.CharField(max_length=300, blank=True)

Forms.py

class CreatePostForm(forms.ModelForm):
     class Meta:
         model = Post
         fields = ['title' , 'content' ]

PostImageFormSet = inlineformset_factory(Post, PostImage, fields=['image', 'description'], exclude=['post'] , max_num=30, extra=3)

Views.py

class PostCreateView(LoginRequiredMixin, CreateView):

     form_class = CreatePostForm
     template_name = 'blog/post_form.html'

     def get_context_data(self, form):
         context = super(PostCreateView. self).get_context_data(**kwargs)
         if self.request.POST:
             context['post_images'] = PostImageFormSet(self.request.POST)
         else:
             context['post_images'] = PostImageFormSet()
         return context

      def form_valid(self, form):
          context = self.get_context_data(form=form)
          formset = context['post_images']
          form.instance.author = self.request.user
          if formset.is_valid():
              response = super().form_valid(form)
              formset.instance = self.object
              formset.save()
              return response
          else:
              return super().form_invalid(form)

知道为什么我会收到这种错误吗?谢谢。

【问题讨论】:

    标签: python django inline-formset


    【解决方案1】:

    您应该删除form 参数。 get_context_data 无论如何都不会使用该表单:

    class PostCreateView(LoginRequiredMixin, CreateView):
         form_class = CreatePostForm
         template_name = 'blog/post_form.html'
    
         def get_context_data(self, *args, **kwargs):
             context = super().get_context_data(*args, **kwargs)
             if self.request.POST:
                 context['post_images'] = PostImageFormSet(self.request.POST)
             else:
                 context['post_images'] = PostImageFormSet()
             return context
    
          def form_valid(self, form):
              context = self.get_context_data()
              formset = context['post_images']
              form.instance.author = self.request.user
              if formset.is_valid():
                  response = super().form_valid(form)
                  formset.instance = self.object
                  formset.save()
                  return response
              else:
                  return super().form_invalid(form)

    【讨论】:

    • 你把OP的context = super(PostCreateView. self).get_context_data(**kwargs)改成context = super().get_context_data(*args, **kwargs),指定当前类视图名和不做有什么区别?
    • @Elias:两者是等价的,但是不命名基类的好处是您可以轻松地将其复制粘贴到其他地方。从 Python-3.x 开始,不再需要命名基类。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-25
    • 2023-04-01
    • 2018-06-20
    • 2017-10-20
    • 1970-01-01
    • 2018-01-24
    • 2019-05-27
    相关资源
    最近更新 更多