首页 > 解决方案 > 将 url 参数传递给 Django ModelForm 而不将其呈现为表单上的输入

问题描述

我有一个/<subject_id>/comments/new/呈现 Django的 url ModelForm。我正在使用派生的视图类FormView来处理表单。我希望执行以下操作:

  1. subject_id不应出现在呈现的表单上。
  2. subject_id应该在被调用之前添加到表单中is_valid(),或者如果这不可能,应该添加到Comment实例中。

表格/comment_form.py:

class CommentForm(ModelForm):
    class Meta:
        model = Comment
        fields = ['text']

视图.py:

class CommentCreate(FormView):
    form_class = CommentForm

    def form_valid(self, form):
        # Do some stuff to the validated Comment instance
        # Maybe save the comment, maybe not
        return super().form_valid(form)

我该怎么做呢?如果我添加subject_id为一个字段,CommentForm那么它会出现在呈现的表单上。如果我不这样做,则使用 `self.kwargs['subject_id'] 中的 subject_id 实例化表单并抱怨“意外的关键字参数”。

标签: djangodjango-formsdjango-views

解决方案


在文档中四处寻找之后,我发现正确的答案是使用该get_form()方法使用我不想出现在表单上的数据预填充表单,但需要存在以进行验证。

class CommentCreate(FormView):
    form_class = CommentForm

    def get_form(self):
        self.subject= get_object_or_404(Subject, id=self.kwargs['subject_id'])
        partial_comment = Comment(user=self.request.user, subject=self.subject)
        form = CommentForm(**self.get_form_kwargs(), instance=partial_comment)
        return form

推荐阅读