【问题标题】:Django not accepting valid credentialsDjango 不接受有效凭据
【发布时间】:2020-06-08 14:35:24
【问题描述】:

views.py。我的默认用户登录模板,我尝试了下面列出的两种方法,但不知道我在哪里犯了错误 - 我每次都收到一个错误,我的凭据不正确

def signup(request):
    if request.method == 'POST':
        form = SignUpForm(request.POST)
        if form.is_valid():
            user = form.save()
            user.refresh_from_db()  # load the profile instance created by the signal
            user.profile.university = form.cleaned_data.get('university')
            user.save()
            raw_password = form.cleaned_data.get('password1')
            user = authenticate(username=user.username, password=raw_password)
            #user_login(request, user)
            return redirect('main:main_page')
    else:
        form = SignUpForm()
    return render(request, 'signup.html', {'form': form})

def user_login(request):
    '''
    Using different method for getting username, tried this and didn't work either
    if request.method == 'POST':
        form = AuthenticationForm(request, data=request.POST)
        if form.is_valid():
            username = form.cleaned_data.get('username')
            password = form.cleaned_data.get('password')
            user = authenticate(username=username, password=password)
            if user is not None:              
                login(request,user)
                messages.info(request, "Successfully signed in")
                return redirect('main:home')
            else:
                message = 'Sorry, the username or password you entered is not valid please try again.'
                return render(request, 'login.html', {'message':message})
        else:
            message = 'Invalid'
            return render(request, 'login.html', {'message':message})
    else:
        form=AuthenticationForm()
        return render(request, 'login.html', {"form":form})
    '''
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        user = authenticate(username=username, password=password)
        if user is not None:
            if user.is_active:
                login(request,user)
                return HttpResponseRedirect(reverse('index'))
            else:
                return HttpResponse("Your account was inactive.")
        else:
                message = 'Sorry, the username or password you entered is not valid please try again.'
                return render(request, 'login.html', {'message':message})
    else:
        message = 'Request failed please try again.'
        return render(request, 'login.html', {'message':message})

models.py

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    first_name = models.CharField(max_length=100, blank=True)
    last_name = models.CharField(max_length=100, blank=True)
    email = models.EmailField(max_length=150)
    bio = models.TextField()
    university = models.CharField(max_length=30)


    def __str__(self):
        return self.user.username

    @receiver(post_save, sender=User)
    def update_profile_signal(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)
    instance.profile.save()

forms.py

class SignUpForm(UserCreationForm):
    university = forms.CharField(max_length=30)

    class Meta:
        model = User
        fields = ('username', 'first_name', 'last_name', 'email','university', 'password1', 'password2',)

应用 urls.py

app_name = 'main'

urlpatterns=[
    path('signup/',views.signup,name='signup'),
    path('user_login/',views.user_login,name='user_login'),
    path('main_page/',views.main_page,name='main_page'),
]

login.html 表单

<form method="POST" action="{% url 'main:user_login' %}/" class="form-signin">
                {%csrf_token%}
                <div class="form-label-group">
                  <input type="text" name="username" id="inputText" class="form-control" placeholder="Username" required autofocus>
                  <br/>
                </div>
                <div class="form-label-group">
                  <input type="password" name="password" id="inputPassword" class="form-control" placeholder="Password" required>

                </div>

                <div class="custom-control custom-checkbox mb-3">
                  <input type="checkbox" class="custom-control-input" id="customCheck1">
                  <label class="custom-control-label" for="customCheck1">Remember password</label>
                </div>
                <input type="submit" class="form-control" name="" value="Login">
                <hr class="my-4">
                <p>Don't have account? <a href="{% url 'main:signup' %}" id="signup">Sign up here</a></p>
                {% if message %}<p style="color: red;">{{message}}</p>{% endif %}
                <a href="{% url 'password_reset' %}" id="signup">Forgot Password</a>
              </form>

我无法弄清楚为什么我的 Django 不接受正确的凭据。我的代码的哪一部分似乎不正确?

【问题讨论】:

    标签: django django-forms django-authentication


    【解决方案1】:

    确保为 django 设置定义正确的用户模型,添加

    # AUTH_USER_MODEL = 'YOUR_APP_NAME.YOUR_CUSTOM_USER_MODEL'
    

    到你的 django 设置 .like # AUTH_USER_MODEL = 'users.User'

    你需要编写一个抽象的用户模型。

    from django.contrib.auth.models import AbstractUser
    class RightsSupport(models.Model):
        class Meta:
    
            managed = False  # No database table creation or deletion  \
            # operations will be performed for this model.
    
            permissions = (
    
                ("add_user", "Can Create User"),
                ("view_user", "Can View Single User"),
                ("change_user", "Can Change User"),
                ("list_user", "Can View User List"),
    
                ("add_plan", "Can Create Plan"),
                ("view_plan", "Can View Single Plan"),
                ("change_plan", "Can Change Plan"),
                ("list_plan", "Can View Plan List"),
      )
    
    
    class User(AbstractUser):
        CREATED = 0
        ACTIVE = 1
        BANNED = 2
        KICKED = 3
        UPGRADE = 4
        STS = (
            (CREATED, 'Just Created'),
            (ACTIVE, 'Activated'),
            (BANNED, 'Disabled'),
            (KICKED, 'Disabled'),
            (UPGRADE, 'Active'),
         )
        status = models.IntegerField(choices=STS, default=CREATED, blank=True, null=True)
        def __str__(self):
            return self.username
    

    同时更新您的观点,该代码有一个巨大的错误。您忘记关闭 docstring 。

    def signup(request):
        if request.method == 'POST':
            form = SignUpForm(request.POST)
            if form.is_valid():
                user = form.save()
                user.refresh_from_db()  # load the profile instance created by the signal
                user.profile.university = form.cleaned_data.get('university')
                user.save()
                raw_password = form.cleaned_data.get('password1')
                user = authenticate(username=user.username, password=raw_password)
                #user_login(request, user)
                return redirect('main:main_page')
        else:
            form = SignUpForm()
        return render(request, 'signup.html', {'form': form})
    
    def user_login(request):
        '''
        Using different method for getting username, tried this and didnt work either
        '''
        if request.method == 'POST':
            form = AuthenticationForm(request, data=request.POST)
            if form.is_valid():
                username = form.cleaned_data.get('username')
                password = form.cleaned_data.get('password')
                user = authenticate(username=username, password=password)
                if user is not None:              
                    login(request,user)
                    messages.info(request, "Successfully signed in")
                    return redirect('main:home')
                else:
                    message = 'Sorry, the username or password you entered is not valid please try again.'
                    return render(request, 'login.html', {'message':message})
            else:
                message = 'Invalid'
                return render(request, 'login.html', {'message':message})
        else:
            form=AuthenticationForm()
            return render(request, 'login.html', {"form":form})
    
    
    
    
    
    

    【讨论】:

    • 感谢您的帮助。据我了解,我唯一需要做的两件事就是将 AbstractUser 类添加到我的模型中,没有额外的身份验证字段,因为我将用户名作为身份验证并将 AUTH_USER_MODEL = 'users.User' 添加到我的 settings.py?什么是 RightsSupport 我不明白。我需要在表单和注册页面中添加任何其他字段吗?
    猜你喜欢
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    • 2019-11-13
    • 2019-01-05
    • 1970-01-01
    • 1970-01-01
    • 2018-03-25
    • 1970-01-01
    相关资源
    最近更新 更多