django - 定义的可选表单字段不是那么可选
问题描述
我查看了这个主题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?
解决方案
发生错误是因为 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)
推荐阅读
- ruby-on-rails - 控制器的未定义局部变量或方法“参数”
- javascript - 要单击图像图标,react-datepicker 的输入框不起作用
- continuous-integration - Bitbucket / 我看不到管道中的工件
- java - 如何通过 WiFiP2P 为客户端/服务器调用相同的功能?
- python - python Problem Set 1 Part C 中的 MIT 编程
- html - 当容器 ul 可见时绘制 svg 线条
- c# - 在重定向期间在 RestSharp 中保留授权标头
- eclipse - Eclipse IDE BUG - 优化级别,调试级别弹出到 NONE
- angular - 找不到模块的 NgModule 元数据中的错误('DeviceProfileConfigurationModule')
- java - 如何在 Java 中的网络摄像头上运行训练有素的 Tensorflow 模型