像 GenericView 一样进行表单验证
Form validate like GenericView
使用通用视图时,您会得到 django 的简洁功能,它会在模板中发布错误消息,例如 "This field is required!"。
根据我的理解,CreateView 继承了一个名为 form_invalid
的方法,其中 returns self.render_to_response(self.get_context_data(form=form))
我只是猜测这就是神奇之处?
现在我正在写一个表格,想知道是否也可以使用该功能?
我创建了一个 custom_user 模型,并尝试创建一个简单的创建功能。到目前为止我有:
Models.py
class Custom_User(AbstractBaseUser):
email = models.EmailField(max_length=250, unique=True)
password = models.CharField(max_length=100)
USERNAME_FIELD = 'email'
forms.py
class create_User_Form(forms.ModelForm):
confirm_password = forms.CharField(widget = forms.PasswordInput(attrs={'class' :'form-control'}))
class Meta:
model = Custom_User
fields = ['email', 'password']
widgets = {
'email' : forms.TextInput(attrs={'class' :'form-control'}),
'password' : forms.PasswordInput(attrs={'class' :'form-control'}),
}
def clean(self):
cleaned_data = super(create_User_Form, self).clean()
password = cleaned_data.get("password")
confirm_password = cleaned_data.get("confirm_password")
if password != confirm_password:
raise forms.ValidationError(
"password and confirm_password does not match"
)
return self.cleaned_data
urls.py
urlpatterns = [
url(r'^$', views.index, name='index'),
url(r'^create_user/$', views.create_user, name='create_user'),
]
views.py
def create_user(request):
form = create_User_Form(request.POST)
if form.is_valid():
print('valid')
else:
print('error')
return redirect('Eapp:index')
def index(request):
create_user_form_ = create_User_Form()
context = {
'create_user_form' : create_user_form_,
}
return render(request, 'index.html', context)
您似乎混淆了基于函数的视图和基于 class 的视图。您尝试的是功能基础视图。为了完整,它需要看起来像这样
def create_user(request):
if request.method == 'POST':
create_user_form_ = create_User_Form(request.POST)
if form.is_valid():
print('valid')
return redirect('Eapp:index')
else:
print('error')
else:
create_user_form_ = create_User_Form()
context = {
'create_user_form' : create_user_form_,
}
return render(request, 'index.html', context)
请注意,这结合了您的索引和创建用户方法,因为它们包含需要一起使用的功能。
另一方面,如果您想使用 CreateView,您的代码会变得更短
class UserCreate(CreateView):
model = Custom_User
form_class = create_User_Form
确实如此。但您可以添加改进。
作为旁注。在 python 中命名 classes 的标准方式是
CreateUserForm
使用通用视图时,您会得到 django 的简洁功能,它会在模板中发布错误消息,例如 "This field is required!"。
根据我的理解,CreateView 继承了一个名为 form_invalid
的方法,其中 returns self.render_to_response(self.get_context_data(form=form))
我只是猜测这就是神奇之处?
现在我正在写一个表格,想知道是否也可以使用该功能?
我创建了一个 custom_user 模型,并尝试创建一个简单的创建功能。到目前为止我有:
Models.py
class Custom_User(AbstractBaseUser):
email = models.EmailField(max_length=250, unique=True)
password = models.CharField(max_length=100)
USERNAME_FIELD = 'email'
forms.py
class create_User_Form(forms.ModelForm):
confirm_password = forms.CharField(widget = forms.PasswordInput(attrs={'class' :'form-control'}))
class Meta:
model = Custom_User
fields = ['email', 'password']
widgets = {
'email' : forms.TextInput(attrs={'class' :'form-control'}),
'password' : forms.PasswordInput(attrs={'class' :'form-control'}),
}
def clean(self):
cleaned_data = super(create_User_Form, self).clean()
password = cleaned_data.get("password")
confirm_password = cleaned_data.get("confirm_password")
if password != confirm_password:
raise forms.ValidationError(
"password and confirm_password does not match"
)
return self.cleaned_data
urls.py
urlpatterns = [
url(r'^$', views.index, name='index'),
url(r'^create_user/$', views.create_user, name='create_user'),
]
views.py
def create_user(request):
form = create_User_Form(request.POST)
if form.is_valid():
print('valid')
else:
print('error')
return redirect('Eapp:index')
def index(request):
create_user_form_ = create_User_Form()
context = {
'create_user_form' : create_user_form_,
}
return render(request, 'index.html', context)
您似乎混淆了基于函数的视图和基于 class 的视图。您尝试的是功能基础视图。为了完整,它需要看起来像这样
def create_user(request):
if request.method == 'POST':
create_user_form_ = create_User_Form(request.POST)
if form.is_valid():
print('valid')
return redirect('Eapp:index')
else:
print('error')
else:
create_user_form_ = create_User_Form()
context = {
'create_user_form' : create_user_form_,
}
return render(request, 'index.html', context)
请注意,这结合了您的索引和创建用户方法,因为它们包含需要一起使用的功能。
另一方面,如果您想使用 CreateView,您的代码会变得更短
class UserCreate(CreateView):
model = Custom_User
form_class = create_User_Form
确实如此。但您可以添加改进。
作为旁注。在 python 中命名 classes 的标准方式是
CreateUserForm