Skip to main content
 首页 » 编程设计

python之Django CreateView get_initial 外键

2024年09月07日36Leo_wl

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

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

请您参考如下方法:

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