首页 > 解决方案 > 定义的可选表单字段不是那么可选

问题描述

我查看了这个主题Django: Optional model form field但没有帮助解决我的问题。

我需要该字段timeout是可选的,这意味着当用户将其留空时,它将默认为 10

这是我到目前为止所得到的:

楷模:

class MyModel(models.Model):
    timeout = models.IntegerField(default=10)

模型形式:

class MyModelForm(forms.ModelForm):
    # ...
    timeout = forms.IntegerField(
       widget=forms.TextInput(attrs={
             'class': 'form-control',
             'placeholder': 'Enter Timeout (optional)'}),
       required=False, label='')
    # ...

    class Meta:
        # ...

看法:

class CreateTestSuite(FormView):
    template_name = 'create_test_suite.html'
    form_class = MyModelForm
    success_url = '/list'
    context_object_name = 'user_id'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['user_id'] = self.request.user.id
        return context

    def form_valid(self, form):
        form.save()  #  this is where form submission throws an error
        return HttpResponseRedirect(self.success_url)

回溯说NOT NULL constraint failed: timeout

那么我还需要在哪里指定表单字段是可选的,如果留空,则在数据库中默认为 10?

标签: djangodjango-forms

解决方案


发生错误是因为 DB 中的字段不能为空,尽管在表单中它不是必需的。

作为 timeout 一个可选字段,您应该使其可以为空:

class MyModel(models.Model):
    timeout = models.IntegerField(default=None, null=True)

或者,如果您仍想timeout在 DB 中的字段中添加一些值,则可以覆盖该save()方法:

class MyModel(models.Model):
    timeout = models.IntegerField(default=10)

    def save(self, *args, **kwargs):
        if not self.timeout:
             self.timeout = 10
        super(MyModel, self).save(*args, **kwargs)  

推荐阅读