代码之家  ›  专栏  ›  技术社区  ›  leelum1

django createview get_初始外键

  •  1
  • leelum1  · 技术社区  · 6 年前

    我有一张表格,我想用 get_initial 方法设置外键。模型是

    class CardioRecord(models.Model):
        date_uploaded = models.DateField(auto_now=True)
        client = models.ForeignKey(User, on_delete=models.CASCADE)
        run_dist = models.FloatField(blank=True, null=True)
        run_time = models.FloatField(blank=True, null=True)
    

    形式是

    class CardioRecordForm(forms.ModelForm):
            class Meta:
                model = CardioRecord
                fields = [
                            'client',
                          'run_dist',
                          'run_time',
                          ]
                labels = {
                    'run_dist': 'Distance (km)',
                    'run_time': 'Time (min)',
                }
                widgets = {
                    'client': forms.HiddenInput()
                }
    

    景色是

    class CardioCreateView(CreateView):
        model = CardioRecord
        form_class = CardioRecordForm
        template_name = 'training/cardio_form.html'
    
        def get_initial(self):
            initial = super(CardioCreateView, self).get_initial()
            initial['client'] = self.request.user.pk
            return initial
    

    我得到的错误是

    null value in column "client_id" violates not-null constraint
    

    看起来初始值没有传递给表单。如何将外键传递到表单?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Alasdair    6 年前

    使用隐藏字段不会阻止用户编辑该值。如果要在视图中设置该值,请将其从 fields 形式:

    class CardioRecordForm(forms.ModelForm):
            class Meta:
                model = CardioRecord
                fields = [
                          'run_dist',
                          'run_time',
                          ]
    

    然后在 form_valid 方法:

    class CardioCreateView(CreateView):
        def form_valid(self, form):
            form.instance.client = self.request.user
            return super(CardioCreateView. self).form_valid(form)
    

    然后你可以移除你的 get_initial 方法。