繁体   English   中英

django模型表单中的表单必填字段

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM