В системе, которую я создал с помощью Django, пользователи не должны входить в систему без одобрения администратора после регистрации. Например, после того, как пользователь заполнит регистрационную форму, пользователь увидит предупреждение
ждем одобрения администратора
и не может войти в систему без одобрения панели администратора.
просмотры.py
def signup(request):
form_class = SignUpForm
if request.method == 'POST':
form = SignUpForm(request.POST)
if form.is_valid():
user = form.save()
user.refresh_from_db() # load the profile instance created by the signal
user.save()
raw_password = form.cleaned_data.get('password1')
user = authenticate(username=user.username, password=raw_password)
user.first_name = form.data['first_name']
user.last_name = form.data['last_name']
user.rank = form.data['rank']
user.comp_name = form.data['comp_name']
login(request, user)
return redirect('/')
else:
form = form_class()
return render(request, 'signup.html', {'form': form})
модели.py
class UserProfile(AbstractUser):
ranks = (
('analyst', 'Analyst'),
...
)
comp_name = models.CharField(max_length=200, default = "Choose")
user_id = models.UUIDField(default=uuid.uuid4(), editable=False, unique=True)
username = models.CharField(max_length=500, unique=True)
first_name = models.CharField(max_length=200)
last_name = models.CharField(max_length=200)
password = models.CharField(max_length=50)
email = models.EmailField(max_length=254)
rank = models.CharField(max_length=200, choices=ranks)
Итак, вы используете пользовательскую модель пользователя, основанную на встроенной абстрактной модели. Модель AbstractUser
имеет поле с именем is_active
, которое вы можете использовать здесь.
В процессе регистрации установите для is_active
значение False
и используйте форму AuthenticationForm
по умолчанию для входа в систему. Эта форма автоматически проверит наличие флага is_active
и выдаст сообщение об ошибке, если это False
.
Сообщения об ошибках по умолчанию (вы можете настроить их):
error_messages = {
'invalid_login': _(
"Please enter a correct %(username)s and password. Note that both "
"fields may be case-sensitive."
),
'inactive': _("This account is inactive."),
}
Вы можете получить форму из упаковки auth
:
from django.contrib.auth.forms import AuthenticationForm
В пользовательской панели администратора для модели UserProfile
добавьте фильтр для флага is_active
:
class UserProfileAdmin(admin.ModelAdmin):
list_filters = ["is_active"]
Таким образом, вы сможете перечислить неактивные профили и активировать их в админке.
Если вы не хотите использовать сообщения об ошибках по умолчанию, представленные в форме, лучше всего создать свою собственную форму AuthenticationForm
, используя ее в качестве основы (MyAuthenticationForm(AuthenticationForm):
), и предоставить свои собственные сообщения об ошибках (в том же формате, что и словарь error_messages
). из ответа).
Где я должен добавить раздел error_messages в свой код?