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')