【问题标题】:Django CreateView : Append ForeignKey to CustomForm DataDjango CreateView:将 ForeignKey 附加到 CustomForm 数据
【发布时间】:2012-11-08 09:24:09
【问题描述】:

我有一个 CreateView 如下:

class ResumeCreateView(CreateView):
    model = Resume

    def form_valid(self, request, form):
        candidate = Candidate.objects.get(user=self.request.user)
        self.object = form.save(commit=False)
        self.object.candidate = candidate
        self.object.save()
        f = self.request.FILES.get('file')
        data = [{
            'title': self.request['title'],
            'name': f.name,
        }]  
        response = JSONResponse(data, {}, response_mimetype(self.request))
        response['Content-Disposition'] = 'inline; filename=files.json'
        return response

在这里,我试图将 candidate 实例附加到 Resume 模型候选字段,这是 ForeignKeyCandidate 模型的候选字段。

但我总是收到验证错误{'candidate' : 'This field is required'}

  • 我使用的是自定义表单而不是模型表单,因为它使用 twitter 引导标识符。

我错过了什么?

【问题讨论】:

    标签: python django foreign-keys form-data create-view


    【解决方案1】:

    您必须定义一个modelFormcandidate 作为排除字段,然后在form_valid() 方法中设置它。

    class ResumeForm(forms.ModelForm):
        class Meta:
            model = Resume
            exclude = ('candidate',)
    
    class ResumeCreateView(CreateView):
        form_class = ResumeForm
        model = Resume
    
        def form_valid(self, form):
            form.instance.candidate = Candidate.objects.get(user=self.request.user)
            ....
    

    更详细的参考:Models and request.user

    【讨论】:

    • 嘿 Rohan,我知道它可以与 ModelForm 一起使用,抱歉我忘了提到我正在使用自定义表单。自定义表单是否有解决方法。 ?
    • @Amyth,如果不按照建议定义模型表单,我认为它不会起作用。如果没有该 django 框架,也会创建需要 candidate 字段的表单,而当您 POST 时该字段不存在。
    【解决方案2】:

    我没有足够的业力发表评论,但我只是想指出这对我的问题有效,我唯一的变化(根据 Rohan 的回答)是我不需要创建表单。

    class ChoiceCreateView(generic.CreateView): model = Choice template_name = 'polls/choice.html' fields = ['choice_text']

    相反,我指定了我想在视图中显示的字段,而不是在表单中排除它们。 :)

    【讨论】:

      【解决方案3】:

      我以前遇到过这个确切的问题。为了快速解决问题,请使用隐藏输入在表单中包含候选人,如下所示:

      <input type="hidden" name="candidate" id="id_candidate" value="{{ request.user.id }}">
      

      不过,将来请考虑使用django-crispy-forms,而不是手写表单。

      【讨论】:

      • 这是个坏主意:您应该在服务器端设置此类字段,例如在视图的 POST 中。用户可能会提交不同的用户 ID,而您只是不希望这种情况发生。
      猜你喜欢
      • 2015-04-07
      • 2017-12-16
      • 2013-10-30
      • 1970-01-01
      • 2020-07-08
      • 1970-01-01
      • 1970-01-01
      • 2016-01-29
      • 1970-01-01
      相关资源
      最近更新 更多