Представление входа абстрактного пользователя

#python #django

#python #django

Вопрос:

Я потратил на это пару дней, прочитал документы, прочитал информацию о двух пакетах, и я что-то упускаю. Я пытаюсь создать представление для входа в AbstractUser. Модель my_app AbstractUser включена, а представление находится в приложении с именем mainsite , которое я использую для хранения представлений всего проекта.

После входа в систему пользователь получит доступ к представлениям на основе классов, которые он будет использовать для добавления, редактирования и удаления записей базы данных. Эти пользователи не являются сотрудниками, поэтому я не предоставляю им доступ к администратору.

Каждый раз, когда я пытаюсь войти в систему как пользователь, authenticate(username, password) (в views.py ) возвращает none.

Чего мне не хватает?

Вот настройка — у меня есть пользовательская модель Person, которая расширяет модель AbstractUser:

 # 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/

Это представление регистрирует пользователя:

 # 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. Как вы создали пользователя в первую очередь?

2. С помощью администратора. Я обнаружил проблему: мне нужно создать пользовательскую UserCreationForm и UserChangeForm.

Ответ №1:

Я нашел ответ (с помощью reddit) в документах.

При использовании AbstractUser вам необходимо создать свои собственные UserCreationForm и UserChangeForm.Если вы используете AbstractBaseUser, то вам нужно будет создать дополнительные формы.

Я не создавал эти формы, и я создал своих пользователей в администраторе, используя формы, автоматически сгенерированные Django. Эти формы неправильно установили пароль. Вероятно, использовалась автоматически сгенерированная форма user.password = 'some_password' . Правильный способ сделать это user.set_password('some_password') .

, login_view, name='login'),
...
Это представление регистрирует пользователя:


И, наконец, вот шаблон с полями входа:


Комментарии:

1. Как вы создали пользователя в первую очередь?

2. С помощью администратора. Я обнаружил проблему: мне нужно создать пользовательскую UserCreationForm и UserChangeForm.

Ответ №1:

Я нашел ответ (с помощью reddit) в документах.

При использовании AbstractUser вам необходимо создать свои собственные UserCreationForm и UserChangeForm.Если вы используете AbstractBaseUser, то вам нужно будет создать дополнительные формы.

Я не создавал эти формы, и я создал своих пользователей в администраторе, используя формы, автоматически сгенерированные Django. Эти формы неправильно установили пароль. Вероятно, использовалась автоматически сгенерированная форма user.password = 'some_password' . Правильный способ сделать это user.set_password('some_password') .