清除Django中有关验证错误的所有表单字段 [英] Clear all Form Fields on Validation Error in Django

查看:41
本文介绍了清除Django中有关验证错误的所有表单字段的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个简单的用户注册表格(位于forms.py中):

来自django.contrib.auth.models的

 导入用户类UserForm(forms.ModelForm):密码= forms.CharField(widget = forms.PasswordInput验证者= [MinLengthValidator(6)])password_repeat = forms.CharField(widget = forms.PasswordInput)类Meta:型号=用户字段= ['用户名','密码','密码重复'] 

如果有人尝试输入某些内容,但验证失败,我希望再次呈现相同的表单,但应清除所有字段.目前,我的视图如下所示(在views.py中):

  def signup(请求):形式= UserForm(request.POST或无)如果form.is_valid():用户= form.save(commit = False)用户名= form.cleaned_data ['用户名']密码= form.cleaned_data ['password']password_repeat = form.cleaned_data ['password-repeat']user.set_password(密码)user.save()用户= auth.authenticate(用户名=用户名,密码=密码)如果user不为None且user.is_active:auth.login(请求,用户)返回重定向('/')返回render(request,'signup.html',{'form':form}) 

问题是 form.fields ['username'] 字段仍包含输入的用户名,并因此传递给渲染.

我一直在寻找解决方案,但找不到.我的猜测是,该解决方案与我似乎没有得到的 clean()方法有关.

解决方案

要在保留所有表单验证错误的同时始终清除特定表单字段,可以创建一个自定义输入窗口小部件,该窗口小部件始终忘记"其旧值.例如:

Django导入表单中的

 类NonstickyTextInput(forms.TextInput):'''自定义文本输入窗口小部件,它是非粘性的"(即不记得提交的值).'''def get_context(自身,名称,值,属性):value = None#清除提交的值.返回super().get_context(名称,值,属性)类MyForm(forms.Form):用户名= Forms.CharField(widget = NonstickyTextInput())#... 

参考: django.forms.Widget.get_context

行为

假设我们在这样的视图中使用 MyForm :

来自django.shortcuts的

 导入渲染,重定向从myapp.forms导入MyFormdef myview(要求):如果request.method =='POST':表格= MyForm(request.POST)如果form.is_valid():#用提交的值做一些事情...返回重定向("home_page")别的:形式= MyForm()返回render(request,'myapp/myview.html',{'form':form}) 

当表单遇到任何验证错误并重新显示该表单时,所有常见的验证错误消息都将显示在表单上,​​但显示的 username 表单字段将为空白.

I have a simple user registration form (in forms.py):

from django.contrib.auth.models import User

class UserForm(forms.ModelForm):
    password = forms.CharField(widget=forms.PasswordInput
                               validators=[MinLengthValidator(6)])
    password_repeat = forms.CharField(widget=forms.PasswordInput)

    class Meta:
        model = User
        fields = ['username', 'password','password_repeat']

If someone tries to enter something and the validation fails I want the same form to be rendered again but all fields should be cleared. At the moment my view looks like this (in views.py):

def signup(request):
    form = UserForm(request.POST or None)

    if form.is_valid():
        user = form.save(commit=False)
        username = form.cleaned_data['username']
        password = form.cleaned_data['password']
        password_repeat = form.cleaned_data['password-repeat']
        user.set_password(password)
        user.save()
        user = auth.authenticate(username=username, password=password)
        if user is not None and user.is_active:
            auth.login(request, user)
            return redirect('/')

return render(request, 'signup.html', {'form': form})

The problem is that the form.fields['username'] field still contains the username that was entered and is thus passed to render.

I've been searching for a solution a while now but can't find it. My guess is that the solution has something to do with the clean() method that I don't seem to get.

解决方案

To always clear a particular form field while preserving all form validation errors, you can create a custom input widget that always "forgets" its old value. For example:

from django import forms

class NonstickyTextInput(forms.TextInput):
    '''Custom text input widget that's "non-sticky"
    (i.e. does not remember submitted values).
    '''
    def get_context(self, name, value, attrs):
        value = None  # Clear the submitted value.
        return super().get_context(name, value, attrs)

class MyForm(forms.Form):
    username = forms.CharField(widget=NonstickyTextInput())
    # ...

Reference: django.forms.Widget.get_context

Behavior

Suppose we are using MyForm in such a view:

from django.shortcuts import render, redirect
from myapp.forms import MyForm

def myview(request):
    if request.method == 'POST':
        form = MyForm(request.POST)
        if form.is_valid():
            # Do something with the submitted values...
            return redirect('home_page')
    else:
        form = MyForm()
    return render(request, 'myapp/myview.html', {'form': form})

When the form encounters any validation error and the form is re-displayed, all the usual validation error messages will be shown on the form, but the displayed username form field will be blank.

这篇关于清除Django中有关验证错误的所有表单字段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆