#django #registration #django-registration
#django #Регистрация #django-регистрация
Вопрос:
Я использую (и изучаю) Django в своем новейшем продукте, и я только что установил и начал использовать приложение django-registration, чтобы позволить моим пользователям автоматически регистрироваться.
Все работает хорошо, но я подумываю о том, чтобы назначить каждого нового пользователя определенной группе (уже созданной), чтобы я мог «отделить» администраторов от обычных пользователей.
Как я могу это сделать? Документация об этом приложении ужасна, ИМО.
Я не создавал никакой модели или конфигурации, чтобы начать использовать приложение django-registration.
Ответ №1:
В итоге я создал для этого форк, так как это сводило меня с ума.
https://github.com/kcunning/django-registration
В принципе, добавьте следующее в свой settings.py файл:
REGISTRATION_DEFAULT_GROUP_NAME=»Имя_группы»
Любой пользователь, добавленный через модуль регистрации, получит эту группу при создании.
Комментарии:
1. это безумие! Как что-то настолько простое может быть таким сложным
Ответ №2:
Для начала, я не эксперт в d-r (django-регистрация) и на самом деле проверил это только потому, что вы упомянули об этом в своем вопросе. Итак, если у кого-то еще есть лучший ответ, пожалуйста, отправьте его. В любом случае, вот оно.
Я заметил, что способ создания пользователей (или «профилей», как их называет d-r) находится в функции create_inactive_user, расположенной в registration.models.RegistrationManager. Итак, в этой функции после:
new_user.is_active = False
new_user.save()
Вы могли бы добавить что-то вроде:
default_group = Group.objects.get(name=WHATEVER_THE_GROUP_NAME_IS)
user_group, is_created = UserGroup.get_or_create(user=new_user)
user_group.group = default_group
#user_group.groups.add(default_group) # Django ver. 1.7
user_group.save()
Вероятно, вы могли бы обойтись без get_or_create, поскольку я не думаю, что вы можете создать более одного пользователя с одним и тем же именем пользователя, но я предпочел бы перестраховаться, чем сожалеть.
Этот метод заставит вас редактировать файлы d-r (что, возможно, не самое лучшее, что можно сделать) наряду с жестким кодированием определенных вещей (таких как название группы по умолчанию), но это должно быть хорошей отправной точкой.
PS. именем группы по умолчанию может быть переменная, расположенная в settings.py файл, который сделал бы его более доступным и красивым. Пример:
settings.py:
DEFAULT_GROUP_NAME = 'YOUR GROUP NAME'
registration/models.py:
default_group = Group.objects.get(name=settings.DEFAULT_GROUP_NAME)
В любом случае, надеюсь, это поможет.
Комментарии:
1. Кроме того, если вы не используете таблицу фактических разрешений (или свою собственную) и вам нужно только различать пользователей и администраторов, тогда вы также можете использовать поля is_staff и is_superuser в модели пользователя.
2. Это действительно хороший ответ, но я подожду других ответов, так как я не хочу ничего менять внутри d-r кода (это вне моего проекта)
3. @TiuTalk правда, это вне вашего проекта, но если вы используете virtualenv, то изменение установленных пакетов для одного проекта не должно быть слишком большой проблемой. Для меня я изменил файл в ENV / lib / python2.7 /site-packages /registration, который был локальным для моего данного проекта django.
4. По крайней мере, начиная с версии 0.8, вы также могли бы использовать серверный подход. Создайте свой собственный сервер, дублируя серверную часть, которую вы уже используете (будь то «default» или «simple»). Переместите его из каталога d-r packages куда-нибудь в свой проект. Затем измените функцию register () по мере необходимости, не чувствуя, что вы что-то нарушаете, поскольку теперь это ваш собственный сервер.
5. @BryceSiedschlaw: Я обнаружил, что у user_group ‘нет атрибута ‘group’ ‘. Правильный атрибут — ‘groups’, по крайней мере, в Django 1.7! Итак, очередь дошла
user_group.groups.add(default_group)
! В любом случае спасибо за совет! Теперь работает для меня!
Ответ №3:
django-registration-redux имеет пользовательские сигналы, которые могут быть использованы для назначения зарегистрированного пользователя в определенную группу. для этой цели можно использовать сигнал «user_registered». Пожалуйста, обратитесь к документации django-registration-redux
from django.contrib.auth.models import Group
def user_created(sender, user, request, **kwargs):
group = Group.objects.get(name='Kurum')
group.user_set.add(user)
user.save()
from registration.signals import user_registered
user_registered.connect(user_created)