【问题标题】:Django - authenticate() A user with that username already existsDjango - authenticate() 具有该用户名的用户已经存在
【发布时间】:2017-08-05 04:29:11
【问题描述】:

好吧,我很困惑。

我正在尝试构建一个登录页面,但是每当我尝试登录时,django 都会给出用户名已经存在的错误。我没有在任何地方使用过save()

我正在使用authenticate(),为此我参考了 Django 文档: https://docs.djangoproject.com/en/1.10/topics/auth/default/#how-to-log-a-user-in

这是我的代码,请告诉我哪里出错了:

forms.py

class LoginForm(forms.ModelForm):
    username = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Username'}))
    password = forms.CharField(widget=forms.PasswordInput(attrs={'placeholder': 'Password'}))

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

views.py

class LoginFormView(View):
    form_class = LoginForm
    template_name = 'login.html'

    # display a blank form
    def get(self, request):
        form = self.form_class(None)
        return render(request, self.template_name, {'form': form})

    # authenticate user
    def post(self, request):
        form = self.form_class(request.POST)

        if form.is_valid():

            username = form.cleaned_data['username']
            password = form.cleaned_data['password']

            user = authenticate(username=username, password=password)

            if user is not None:
                if user.is_active:
                    login(request, user)
                    return redirect('slrtcebook:home')

        return render(request, self.template_name, {'form': form})

登录.html

<div class="form-container">
    <form method="post" enctype="multipart/form-data">

        {% csrf_token %}
        {% for field in form %}
            {{ field }}
            {{ field.errors }}
        {% endfor %}

        <input id="submit" type="submit" value="Log in" />
    </form>
</div>

<p>Don't have an account? <a href="/">Register here</a></p>

【问题讨论】:

    标签: python django authentication login


    【解决方案1】:

    不要为此使用 ModelForm;它将假定您正在尝试创建用户,并验证您是否可以使用输入的数据执行此操作。只需使用标准形式 - 从 forms.Form 继承并删除 Meta 类。

    【讨论】:

    • 我非常感谢你,我的朋友,非常感谢。它有效:) 只要 StackOverflow 允许我接受你的回答,我就会接受,呵呵
    【解决方案2】:

    对于那些想要这里的代码的人,我已经做了修复它:

    views.py 内部:

    class UserLoginView(View):
    form_class = LoginForm
    template_name = 'music/login_form.html'
    
    #display a blank form
    def get(self, request):
        form = self.form_class(None)
        return render(request, self.template_name, {'form': form})
    
    #proces form data
    def post(self, request):
        form = self.form_class(request.POST)
    
        if form.is_valid():
    
            # user = form.save(commit=False)
    
            #cleaned (normalized) data
            username = form.cleaned_data['username']
            password = form.cleaned_data['password']
            # user.set_password(password) #this is the only way to change a password because of hashing
    
            #returns the User obejects if credintials are correct
            user = authenticate(username=username, password=password)
    
            if user is not None:
                if user.is_active:
                    login(request, user)
                    return redirect('music:index')
    
    
        return render(request, self.template_name,{'form': form})
    

    froms.py 内部:

    class LoginForm(forms.Form):
    username = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Username'}))
    password = forms.CharField(widget=forms.PasswordInput(attrs={'placeholder': 'Password'}))
    fields = ['username', 'password']
    

    别忘了在views.py的顶部也导入LoginForm,在这里你导入UserForm:

    from .forms import UserForm, LoginForm
    

    【讨论】:

      猜你喜欢
      • 2023-03-30
      • 2017-07-06
      • 1970-01-01
      • 1970-01-01
      • 2015-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多