Django自定义登录页面

cha*_*ate 10 python django validation login

我有一个自定义的Django登录页面.我想在用户名或密码字段为空时抛出异常.我怎样才能做到这一点?

我的view.py登录方法:

def user_login(request):
    context = RequestContext(request)
    if request.method == 'POST':
        # Gather the username and password provided by the user.
        # This information is obtained from the login form.
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(username=username, password=password)
        print("auth",str(authenticate(username=username, password=password)))

        if user:
            # Is the account active? It could have been disabled.
            if user.is_active:
                login(request, user)
                return HttpResponseRedirect('/')
        else:
            return HttpResponse("xxx.")
    else:
        # Bad login details were provided. So we can't log the user in.
        print ("Invalid login details: {0}, {1}".format(username, password))
        return HttpResponse("Invalid login details supplied.")
    else:
        return render_to_response('user/profile.html', {}, context)
Run Code Online (Sandbox Code Playgroud)

我试过这个并没有用:这是forms.py

def clean_username(self):
    username = self.cleaned_data.get('username')
    if not username:
        raise forms.ValidationError('username does not exist.')
Run Code Online (Sandbox Code Playgroud)

小智 11

您可以使用Django提供的登录视图.所以你的login.html应该看起来像那个例子.

<form class="login" method="POST" action="/login/">

  {% csrf_token %}

  {{form.as_p}}

  <li><input type="submit" class="logBut" value="Log in"/></li>
  </form>
Run Code Online (Sandbox Code Playgroud)

并记住urls.py!

url(r'^login/$','django.contrib.auth.views.login', {'template_name': '/login.html'}),
Run Code Online (Sandbox Code Playgroud)

  • 这个答案不再有效,在较新的 django 版本中,您需要使用: `from django.contrib.auth.views import LoginView` `urlpatterns.append(url(r'^login/$', LoginView.as_view(template_name=')登录.html'), name="登录"))` (2认同)

Ala*_*air 5

正确的方法是使用表格,而不是直接从中获取变量request.POST。然后,Django将验证表单数据,并在模板中呈现表单时显示错误。如果需要一个表单字段,那么当该字段为空时,Django将自动显示错误,您甚至不需要为此编写clean_<field_name>方法。

Django已经有一个内置的登录视图。最简单的方法是使用它而不是自己编写。如果您仍然想编写自己的视图,那么查看Django的工作方式仍然很有用。

  • 我不明白为什么每个人都这么想使用内置的登录视图?很抱歉恢复旧线程,但是关于您将如何更改此视图,我是否缺少一种简单的方法?如在中,将类添加到输入元素和其他属性? (4认同)
  • 因为@Alasdair的内置视图非常简单,所以我希望没有人在生产中的网站上放置如此丑陋的登录页面。不用担心,我自己通过创建自定义表单来实现了它。我非常确定该功能与Django登录视图相同,但是看起来更好(使用MDL)。 (3认同)