繁体   English   中英

Django登录后引导用户

[英]Django directing users after login

我在使用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视图吗? 任何帮助都非常有用!

如果没有匹配的条目, 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 ,但是缺点是,如果数据库中有多个条目,则不会引发错误


阅读相关的Django源代码可能会有所帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM