django-регистрация — новый пользователь в определенной группе

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