Django CreateView get_initial 外键

Posted

技术标签:

【中文标题】Django CreateView get_initial 外键【英文标题】:Django CreateView get_initial Foreign Key 【发布时间】:2018-11-24 07:05:20 【问题描述】:

我有一个表单,我正在尝试使用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

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

【问题讨论】:

是的,遇到了同样的问题。谢谢 请显示CardioRecordForm、模板和完整的回溯。您希望用户能够更改表单上的客户端吗? 不,我不希望用户能够更改客户端。我发现我的错误如下所述。感谢您的帮助 【参考方案1】:

使用隐藏字段不会阻止用户编辑值。如果要在视图中设置值,则将其从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 方法。

【讨论】:

以上是关于Django CreateView get_initial 外键的主要内容,如果未能解决你的问题,请参考以下文章

在 Django 1.5 中结合 CreateView 和 DetailView

Django - 如何使用CreateView扩展自定义用户

Django - CreateView 不使用嵌套表单集保存表单

Django:如何处理CreateView中针对UNIQUE约束的错误消息失败

在 Django 中,如何在提交 CreateView 时重定向到 UpdateView?

如何使用请求数据在基于 Django 类的通用 createview 上设置初始数据