【问题标题】:django authentication view doesnt work properlydjango 身份验证视图无法正常工作
【发布时间】:2015-02-16 02:24:55
【问题描述】:

当我尝试通过我的django项目的登录页面登录时,有消息User with this Username already exists. 这里我使用了我自己的身份验证视图:

def login_view(request):
    if request.method == 'POST':
        form = LoginForm(request.POST)
        if form.is_valid():
            username = request.POST['username']
            password = request.POST['password']
            user = authenticate(username=username, password=password)
            if user is None:
                return HttpResponseRedirect('/logger/bad_login/')
            if user.is_active:
                login(request, user)
                return HttpResponseRedirect('/')
            else:
                return HttpResponseRedirect('/logger/bad_login/')
    else:
        form = LoginForm()
    return render(request, 'logger/login.html', {'form': form})

后来我发现了 django stock auth 视图和表单。但是还是想知道为什么我的视图不能正常工作。

我的记录器应用程序的 urls.py,它也用于保存用户活动的数据

from django.conf.urls import patterns, include, url

from logger import views


urlpatterns = patterns('',
    url(r'^$', views.logger_view, name='log'),
    url(r'^login/$', views.login_view, name = 'login'),
    url(r'^bad_login/$', views.bad_login_view, name = 'bad_login'),
)

还有模板

{% extends "base.html" %}

{% block title %}Login {% endblock title %}

{% block content %}
<form action="/logger/login/" method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Submit" />
</form>
{% endblock content %}

登录表单

class LoginForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ('username', 'password')

【问题讨论】:

  • 向我们展示您正在使用的模板和您的网址。
  • LoginForm类是你自己的还是Django的内置类?
  • 添加了模板、url和表单源代码
  • 您确定您的网址被重定向到正确的网址吗?
  • 在输入不正确的数据视图后正常工作并重定向到所需的页面。 '/' URL 怎么样?它正确吗?我在项目的其他块中使用它

标签: django django-views django-authentication


【解决方案1】:

您正在使用 ModelForm,只有在 both the form and the model validation pass 时才有效。

当您使用 User 模型时,您的表单不会在模型级别验证,这就是您的视图失败的原因。

如果您因此更改登录表单,您的视图将按预期工作:

class LoginForm(forms.Form):  # A normal form, not a model form
    username = forms.CharField()
    password = forms.CharField(widget=forms.PasswordInput)

您可能还想修复您的视图,以便正确显示表单错误,并且您也可以正确使用表单:

def login_view(request):
    form = LoginForm(request.POST or None)
    if form.is_valid():
        username = form.cleaned_data['username']
        password = form.cleaned_data['password']
        user = authenticate(username=username, password=password)
        if user is None:
            return HttpResponseRedirect('/logger/bad_login/')
        if user.is_active:
            login(request, user)
            return HttpResponseRedirect('/')
        else:
            return HttpResponseRedirect('/logger/bad_login/')
    return render(request, 'logger/login.html', {'form': form})

【讨论】:

    猜你喜欢
    • 2022-12-22
    • 2016-11-09
    • 1970-01-01
    • 2014-11-17
    • 2012-10-20
    • 1970-01-01
    • 1970-01-01
    • 2020-05-18
    • 1970-01-01
    相关资源
    最近更新 更多