我正在学习django所以我查看了一个教程然后我现在正在寻找另一个。因此,有两个版本的注册表格我来了acrosss。
第一版:
from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
class MyRegForm(UserCreationForm):
email=forms.EmailField(required=True)
class Meta:
model = User
fields =('username','email','password','password2')
def save(self, commit=True):
user=super(UserCreationForm,self).save(commit=False)
if commit:
user.save()
return user
看看第一个版本我能够理解我甚至可以通过这样简单的类扩展来创建一个新的表单:
from django import forms
from models import Article
class ArtForm(forms.ModelForm):
class Meta:
model = Article
fields = ('title', 'body', 'pub_data', 'thumb')
第二版:
from django import forms
from django.contrib.auth.models import User
class SignupForm(forms.Forms):
username = forms.CharField(max_length=20)
email = forms.EmailField()
pass1 = forms.CharField(max_length=20,widget=forms.PasswordInput(render_value=False))
pass2 = forms.CharField(max_length=20,widget=forms.PasswordInput(render_value==False))
def clean_username(self):
try:
User.objects.get(username=self.cleaned_data['username'])
except User.DoesNotExist:
return self.cleaned_data['username']
raise forms.ValidationError("The Username is already in use. Please Choose Another")
def clean_pass2(self):
if self.cleaned_data['pass2']!=self.cleaned_data['pass1']:
raise forms.ValidationError("The two passwords should match")
return self.cleaned_data['pass2']
def save(self):
new_user = User.objects.create_user(username=self.cleaned_data['username'],
email=self.cleaned_data['email'],
password=self.cleaned_data['pass1'])
return new_user
在第二个版本中,我们必须自己设置所有内容,似乎我们有更多的能力可以添加自定义验证。这里的保存功能看起来很奇怪,我在object.save()中看不到它。它只返回对象。 那么专业应该使用哪个版本? 第二个版本中没有任何Meta数据。我认为我们实际上可以混合使用这两种版本,但是它们缺少哪些版本以及哪些版本更常用?
答案 0 :(得分:1)
第二个版本是普通表格,而不是模型表格。它通过调用create_user
来创建User对象,它实例化并保存它,因此不需要显式调用save。
通常,如果您正在处理模型对象,通常最好使用ModelForm。对于User对象,您需要处理散列密码所需的额外复杂性 - create_user
调用user.set_password
,这样做。第一个版本继承自UserCreationForm,它直接在新创建的User实例上调用set_password。如果你正在创建用户,我总是说如果可能的话继承UserCreationForm。
答案 1 :(得分:1)
我会说第一个更干净,但如果您需要进行特殊的User
创建,其中包含无法从表单中获取的数据,或者您希望在非常具体的方式,可能值得使用第二种方法中的一些方法,但即使有了这些更改,也可能不需要使用ModelForm