Как вы уже поняли, установка обязательного атрибута Field в True
предназначена только для проверки бэкэнда, как описано в документации Django .
Что вам действительно нужно, так это добавить обязательный атрибут в Виджет поля:
email.widget.attrs["required"] = "required"
Но если вы действительно хотите написать элегантный, СУХОЙ код, вы должны создать базовый класс формы, который динамически ищет все необходимые поля и изменяет их обязательный атрибут виджета для вас (вы можете называть его как угодно, но «BaseForm» кажется подходящим):
from django.forms import ModelForm
class BaseForm(ModelForm):
def __init__(self, *args, **kwargs):
super(BaseForm, self).__init__(*args, **kwargs)
for bound_field in self:
if hasattr(bound_field, "field") and bound_field.field.required:
bound_field.field.widget.attrs["required"] = "required"
И затем все ваши объекты формы спускаются с него:
class UserForm(BaseForm):
class Meta:
model = User
fields = []
first_name = forms.CharField(required=True)
last_name = forms.CharField(required=True)
email = forms.EmailField(required=True, max_length=100)