使用django ModelForm显示错误

时间:2012-08-01 22:57:24

标签: django validation modelform

我无法弄清楚如何控制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字段错误的示例或提示?

谢谢!

3 个答案:

答案 0 :(得分:1)

如果您想将错误或警告消息返回给用户(即使验证表单中没有错误),您可以使用messaging framework,也可以insert custom error messsages into the form

我认为消息传递框架是您最好的选择 - 我认为将错误注入表单并不是一个好主意。如果有人输入了错误的用户名和密码,则不是验证错误,因此不应将其视为错误。只有在向字段输入错误类型的数据时才应抛出验证错误,而不是错误的值。

答案 1 :(得分:1)

Django authentication app有一个你使用的内置AuthenticationForm。如果查看source code,您可以看到他们的方法是检查clean方法中的用户名和密码。这样,如果用户名和密码组合无效,则可能会引发验证错误,并且表单将显示错误。

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

from django.contrib.auth.forms import Authentication

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

答案 2 :(得分: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!")],)

验证者可以使用您可以验证的多个内置验证规则。

please refer to this django documentation

你也可以在表单定义中使用验证器,但验证器内的错误信息不会像错误时的模型一样工作,自定义错误信息使用下面的第三种方法。

第三种方法:

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

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

我希望这篇文章有所帮助。