登录后 Django 引导用户

Posted

技术标签:

【中文标题】登录后 Django 引导用户【英文标题】:Django directing users after login 【发布时间】:2016-08-02 12:34:14 【问题描述】:

我在使用我的 django 应用程序登录时遇到问题,而且我认为我不太了解登录当前的工作原理。这是我的用户类,它用一些额外的字段扩展了 Django 的用户。额外的字段表示用户的类型,我将其称为 A、B 和 C。

class MyUser(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    isA = models.BooleanField(default=False)
    isB = models.BooleanField(default=False)
    isC = models.BooleanField(default=False)

我有一个登录视图,应该根据用户的类型重定向用户:

def myLogin(request):
    username = request.POST.get('username')
    password = request.POST.get('password')
    user = authenticate(username=username, password=password)
    myuser = MyUser.objects.get(user=user)

    if user is not None:
        if user.is_active:
            login(request, user)
            if myuser.isA:
                return redirect('/aView/')
             elif myuser.isB:
                return redirect('/bView/')
            elif myuser.isC:
                return redirect('/cView/')
        else:
            return HttpResponse('disabled account')
    else:
        return HttpResponse('Invalid login')

我的模板是 django 文档中的默认登录模板:

% extends "base.html" %
% block content %
% if form.errors %
<p>Your username and password didn't match. Please try again.</p>
% endif %

% if next %
    % if user.is_authenticated %
     <p>Your account doesn't have access to this page. To proceed,
    please login with an account that has access.</p>
    % else %
    <p>Please login to see this page.</p>
    % endif %
% endif %

<form method="post" action="% url 'login' %">
% csrf_token %
<table>
<tr>
    <td> form.username.label_tag </td>
    <td> form.username </td>
</tr>
<tr>
    <td> form.password.label_tag </td>
    <td> form.password </td>
</tr>
</table>

<input type="submit" value="login" />
<input type="hidden" name="next" value=" next " />
</form>

% endblock %

目前我收到一条错误消息:

DoesNotExist at /login/
MyUser matching query does not exist.

我也想知道,我不应该将我的“login.html”文件链接到 myLogin 视图吗?非常感谢任何帮助!

【问题讨论】:

看起来对应用户的MyUser 对象还不存在(它确实没有神奇地被创建,即使使用OneToOneField 也是如此)。您可能想使用myuser, created = MyUser.objects.get_or_create(user=user) 或类似名称。 【参考方案1】:

如果没有匹配的条目,get QuerySet 方法会引发 DoesNotExist 异常。 myuser = MyUser.objects.get(user=user) 行需要更改。

尝试/排除

try:
    myuser = MyUser.objects.get(user=user)
except MyUser.DoesNotExist:
    myuser = None

检查存在(额外查询)

 myuser_qs = MyUser.objects.filter(user=user)
 myuser = myuser_qs.get() if myuser_qs.exists() else None

如果有MyUser.MultipleObjectsReturned,这仍然会发出警告

使用第一个/最后一个 QuerySet 方法

myuser = MyUser.objects.filter(user=user).first()

如果没有匹配的条目,这将返回None,但缺点是如果数据库中有多个条目,则不会引发错误


阅读relevant Django source code 可能会有所帮助

【讨论】:

我认为快捷功能myuser = get_object_or_404(MyUser, pk=user)是稍微好一点的解决方案

以上是关于登录后 Django 引导用户的主要内容,如果未能解决你的问题,请参考以下文章

将 Bootstrap 添加到 Inbulit 登录视图 Django

django登录用户,成功登录后用户停留在同一页面

Python全栈100天学习笔记Day47 Django中间件使用

Python全栈100天学习笔记Day47 Django中间件使用

django如何在用户登录后返回到原来来页面,并保持登陆状态

用户注册后Django自动登录(1.4)