#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')
.