我在使用我的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 docs的默认登录模板:
{% 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视图吗?任何帮助都很受欢迎!
答案 0 :(得分:0)
如果没有匹配的条目,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
myuser = MyUser.objects.filter(user=user).first()
如果没有匹配的条目,将返回None
,但缺点是如果数据库中有多个条目,则不会出现错误
阅读relevant Django source code可能会有所帮助