Django 模板文件中 填写表单时 有些字段设置为必填,有些允许不填
Django 表单(ModelForm)字段是否必填,主要由模型字段的 blank
和 null
属性决定,其次可以在表单层通过 required
属性灵活控制。
1. 模型层控制(推荐)
在 models.py
中,字段定义如下:
# 必填(默认)
name = models.CharField('物料名称', max_length=100) # 必填
# 非必填
specification = models.CharField('规格', max_length=100, blank=True) # 非必填
shelf_life = models.PositiveIntegerField('保质期(天)', null=True, blank=True) # 非必填
blank=True
:允许表单留空(前端不必填)null=True
:数据库允许为NULL(适用于数字、日期等)
如需某字段不必填,只需在模型字段加 blank=True
(和 null=True
,如适用)即可。
2. 表单层控制(灵活)
如果你只想在表单层控制(不影响数据库),可以在 MaterialForm
的 __init__
方法中设置:
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['image_url'].required = False # 让图片URL变为非必填
self.fields['barcode'].required = False # 让条形码变为非必填
3. 模板层星号标识同步
- 你可以只给真正必填的字段加星号(*),非必填项不加星号。
- 只需在模板
<label>
里加或不加<span class="text-danger">*</span>
即可。
4. 常见调整建议
- 例如,
specification
、description
、barcode
、image_url
、shelf_life
、reference_cost_price
、reference_sale_price
等通常可以设为非必填。 - 关键业务字段如
name
、code
、category
、unit
、warehouse
、minimum_stock
、maximum_stock
、reorder_point
、price
建议保持必填。
你只需:
- 模型层:加
blank=True
/null=True
,再makemigrations
&migrate
。 - 表单层:
self.fields['xxx'].required = False
。 - 模板层:不加星号。