3

我无法弄清楚如何控制 ModelForms 的字段验证。

这是我的模型表格:

class UserForm(ModelForm):
    class Meta:
        model = User
        fields = ('email', 'password')

这是我在模板中呈现表单的方式:

<form method="post" action="">
    {% csrf_token %}
    {{ userform.as_p }}
    <input type="submit" value="Submit" />
</form>

这是我的看法:

def login_page(request):
    if request.method == 'POST':
        userform = UserForm(request.POST)
        if userform.is_valid():
            email = request.POST['email']
            password = request.POST['password']
            user = authenticate(username=email, password=password)
            if user is not None:
                login(request, user)
                return redirect('/dashboard/')
            else:
                # How can I give the user feedback about authentication failute here. Right now it just reloads the form without any messages.
                return render(request, "login.html", {"userform": userform}) 
        else:
            # Because .is_valid() is called, The userform will validate for email addresses and that a password input is present here.
            return render(request, "login.html", {"userform": userform}) 
    else:
        userform = UserForm()
        return render(request, "login.html", {"userform": userform})

从阅读文档来看,这似乎应该像向我的表单传递一些自定义属性一样简单;但由于我正在使用 ModelForm,我不确定这是否以相同的方式实现。

谁能提供有关如何最好地控制 ModelForm 字段错误的示例或提示?

谢谢!

4

3 回答 3

1

如果您想将错误或警告消息返回给用户(即使经过验证的表单中没有错误),您可以使用消息传递框架,也可以将自定义错误消息插入表单

我认为消息传递框架是您最好的选择——我认为将错误注入表单不是一个好主意。如果有人输入了错误的用户名和密码,这不是验证错误,因此不应这样对待。只有在字段中输入了错误类型的数据而不是不正确的值时,才应引发验证错误。

于 2012-08-01T23:07:00.713 回答
1

Django身份验证应用程序AuthenticationForm具有您使用的内置功能。如果您查看源代码,您可以看到他们的方法是检查clean方法内部的用户名和密码。这样,如果用户名和密码组合无效,则会引发验证错误,并且表单将显示错误。

您可以AuthenticationForm通过以下导入导入并在登录视图中使用它:

from django.contrib.auth.forms import Authentication

您也可以使用内置login视图。这意味着您可以利用添加的功能,例如在用户未启用 cookie 时显示消息。它还降低了您创建安全漏洞的机会。

于 2012-08-02T00:18:26.267 回答
1

很简单,你有多种方式来显示错误信息:

第一:

1-覆盖表单/模型表单中的 clean 方法:

def clean(self):
    # To keep the main validation and error messages
    super(your_form_name, self).clean()

    # Now it's time to add your custom validation
    if len(self.cleaned_data['password']) < 10:
         self._errors['password']='your password\'s length is too short'
         # you may also use the below line to custom your error message, but it doesn't work with me for some reason
         raise forms.ValidationError('Your password is too short')

第二个

通过使用 django 内置的验证器。

您可以使用模型中的验证器和您想要的自定义错误消息,如下所示:

RE = re.compile('^[0-9]{10}$')

field_name = models.CharField('Name', default='your_name',validators=[RegexValidator(regex=RE, message="Inapproperiate Name!")],)

验证器可以利用您可以验证的多个内置验证规则。

请参考这个 django 文档

您也可以在表单定义中使用验证器,但是在出现错误时,验证器中的错误消息将无法像模型那样工作,自定义错误消息使用下面的第三种方法。

第三种方法:

skill = forms.CharField(
    label = 'SSkill', 
    min_length = 2,
    max_length = 12, 
    # message kwarg is only usable in models, yet,
    #it doesn't spawn error here.
    #validators=[RegexValidator(regex=NME, message="In-approperiate number!")], 
    required = True,
    #Errors dictionary 
    error_messages={'required': 'Please enter your skill','min_length':'very short entry','invalid':'Improper format'}, 
    #Similar to default you pass in model
    initial = 'Extreme Coder'
) 

其中,requied、min_length、max_length 以及其他参数都是 fomr kw 参数,只有当上面几行的验证器与您在验证器中选择的标准不匹配时,才会选择无效参数。

第四种方法

在此方法中,您将像这样覆盖模型表单的定义:

def __init__(self, *args, **kwargs):
    super(Your_Form, self).__init__(*args, **kwargs)
    self.fields['password'].error_messages['required'] = 'I require that you fill out this field'

第五种方法:

我在这样的stackoverflow帖子之一中看到了一些自定义错误的好方法:

class Meta:
    model = Customer 
    exclude = ('user',)
    fields = ['birthday','name'] 
    field_args = {
        "name" : {
            "error_messages" : {
                "required" : "Please let us know what to call you!"
                "max_length" : "Too short!!!"
            }           
        }
    }

参考第五种方法是:Brendel's Blog

可能有其他/更好的做事方式,但这些是最常见的,至少对我来说:-)

我希望这篇文章有帮助。

于 2012-10-30T08:38:25.813 回答