我已经花了几天时间阅读文档,阅读了一些两个Scoops信息,我错过了一些东西。我试图创建一个登录AbstractUser的视图。 AbstractUser模型位于my_app
中,视图位于名为mainsite
的应用程序中,用于存储项目范围的视图。
用户登录后,他们将可以访问基于类的视图,这些视图将用于添加,编辑和删除数据库记录。这些用户不是员工,因此我不会授予他们访问管理员的权限。
每次我尝试以用户身份登录时,authenticate(username, password)
(在views.py中)都不会返回。
我错过了什么?
这里是设置 - 我有一个扩展AbstractUser模型的自定义Person模型:
# my_app.models.py
class Person(AbstractUser):
date_left = models.DateField(blank=True, null=True)
phone_number = models.IntegerField(blank=True, null=True)
def _full_name(self):
return self.get_full_name()
full_name = property(_full_name)
def __str__(self):
return self.get_full_name()
class Meta:
verbose_name_plural = 'People'
我已将Person添加到settings.py:
# settings.py
...
AUTH_USER_MODEL = "my_app.Person"
...
我有以下URLconf:
# project/urls.py
from mainsite.views import login_view
...
url(r'^login/$', login_view, name='login'),
...
此视图以用户身份登录:
# mainsite.views.py
def login_view(request):
if request.method == 'POST':
username = request.POST['username']
password = request.POST['password']
user = authenticate(username=username, password=password)
if user is not None:
login(request, user)
return render(request, 'logged_in.html')
else:
return render(request, 'login.html',
{'message': 'Bad username or password'}
)
else:
return render(request, 'login.html')
最后,这里是带有登录字段的模板:
#templates/login.html
<form action="{% url 'login' %}" method="post">
{% csrf_token %}
<div class="row column"><h1>Login</h1></div>
{% if message %}
<div class="row">
<div class="small-12 medium-6 columns">
<div class="alert callout">
<p>{{ message }}</p>
</div>
</div>
</div>
{% endif %}
<div class="row">
<div class="small-12 medium-6 columns">
<label>Username
<input type="text" id="username" name="username">
</label>
</div>
</div>
<div class="row">
<div class="small-12 medium-6 columns">
<label>Password
<input type="password" id="password" name="password">
</label>
</div>
</div>
<div class="row">
<div class="small-12 medium-6 columns">
<input type="submit" value="Log in" class="button">
</div>
</div>
</form>
答案 0 :(得分:2)
我在文档中找到了答案(在reddit的帮助下)。
When you use AbstractUser, you need to create your own UserCreationForm and UserChangeForm.如果您使用AbstractBaseUser,则需要创建其他表单。
我没有创建这些表单,我使用Django自动生成的表单在管理员中创建了我的用户。这些表单未正确设置密码。自动生成的表单可能使用user.password = 'some_password'
。正确的方法是user.set_password('some_password')
。