AbstractUser登录视图

时间:2016-10-13 17:46:30

标签: python django

我已经花了几天时间阅读文档,阅读了一些两个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>

1 个答案:

答案 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')