[英]Form required field in django model forms
我有一个模型表单,但是我正在努力根据需要设置一个字段而不更改模型本身。 当用户提交表单时,有没有办法在不更改 models.py 的情况下强制位置字段?
模型文件
class Profile(models.Model):
user = models.OneToOneField(User)
location = models.CharField(max_length=120, null=True, blank=True)
picture = models.ImageField(upload_to=upload_location, null=True, blank=True)
gender = models.CharField(max_length=120, null=True, choices=GENDER, blank=True)
bio = models.CharField(max_length=1000, null=True, blank=True)
home_university = models.CharField(max_length=50, null=True, blank=True)
我的表格.py
class ProfileForm(forms.ModelForm):
class Meta:
model = Profile
fields = [
"location",
"picture",
"bio",
"gender",
"home_university",
]
和我的 views.py
@login_required
def profile_complete(request):
profile, created = Profile.objects.get_or_create(user=request.user)
form = ProfileForm(request.POST or None, request.FILES or None, instance=profile)
if form.is_valid():
instance = form.save(commit=False)
instance.user = request.user
instance.save()
return redirect("home")
context = {
"form": form,
}
return render(request, "profiles/profile_complete.html", context)
您可以使用以下选项:
1- 初始化功能:
class ProfileForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(ProfileForm, self).__init__(*args, **kwargs)
# Making location required
self.fields['location'].required = True
class Meta:
model = Profile
fields = [
"location",
"picture",
"bio",
"gender",
"home_university",
]
2-通过重新定义字段:
class ProfileForm(forms.ModelForm):
location = forms.CharField(max_length=120, required=True)
class Meta:
model = Profile
fields = [
"location",
"picture",
"bio",
"gender",
"home_university",
]
在您的情况下,这是没有问题的,因为您的模型为null=True
并且您将字段设置为required,但是如果您对其他模型字段使用null=False
此操作,并将ModelForm中的字段覆盖为required=False
,则您必须先在表单或视图中提供一个值,然后再将其保存到数据库中,否则会出现错误。
对于一般知识,我遇到了同样的问题,我解决了如下问题,在Django 4.0 中,您可以在 Meta 类的小部件中添加“必需”
所以你的 forms.py 将是:
class ProfileForm(forms.ModelForm):
class Meta:
model = Profile
fields = [
"location",
"picture",
"bio",
"gender",
"home_university",
]
widget = {
"location":forms.TextInput(attrs={"required": True})
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.