Django表单元和验证
我有以下表格:Django表单元和验证,django,django-forms,Django,Django Forms,我有以下表格: class FindAdvert(forms.ModelForm): class Meta: model = Advert fields = ('id', 'code') 但通过这种方式,我无法“登录”,因为验证返回错误:id已经存在。 如何修改此表单以允许“登录”(而不是注册)?您不需要使用ModelForm登录,因为它的语义目标是创建|编辑数据库数据(无论如何,您可以在视图中硬编码id,但这是错误的方式) 因此,使用自定义验证规则(在
class FindAdvert(forms.ModelForm):
class Meta:
model = Advert
fields = ('id', 'code')
但通过这种方式,我无法“登录”,因为验证返回错误:id已经存在
。
如何修改此表单以允许“登录”(而不是注册)?您不需要使用ModelForm登录,因为它的语义目标是创建|编辑数据库数据(无论如何,您可以在视图中硬编码
id
,但这是错误的方式)
因此,使用自定义验证规则(在clean方法或视图中)创建简单的表单
,如下所示:
class LoginForm(forms.Form):
username = forms.CharField(
label=u'Username',
required=True,
)
password = forms.CharField(
label=u'Password',
required=True,
widget=forms.PasswordInput
)
def clean(self):
cleaned_data = super(LoginForm, self).clean()
username = cleaned_data.get('username')
password = cleaned_data.get('password')
if (username and password and User.objects.filter(username=username).count() == 0)\
or (username and password and User.objects.filter(username=username).count() == 1 and
User.objects.get(username=username).password != password):
raise forms.ValidationError(u'Wrong username or password')
return cleaned_data
视图:
from django.contrib.auth import logout, authenticate, login
from django.views.generic import FormView, RedirectView
# ...
class LoginFormView(FormView):
template_name = 'common/login.html'
form_class = LoginForm
def post(self, request, *args, **kwargs):
form_class = self.get_form_class()
form = self.get_form(form_class)
logout(request)
username = request.POST['username']
password = request.POST['password']
user = authenticate(username=username, password=password)
if user is not None and user.is_superuser:
login(request, user)
return self.form_valid(form)
else:
return self.form_invalid(form)
def get_success_url(self):
return self.request.GET.get('next') or reverse('human:add')
class LogoutRedirectView(RedirectView):
permanent = False
def get_redirect_url(self, *args, **kwargs):
logout(self.request)
return reverse('common:login')