Nomad
Мамыр 15, 2020, 1:11 Т.Қ.

AbstarctUser непонятка

django, user model, Custom, abstractuser

я изучаю пока джангу и я придумал задачку для себя:

  • регистрация (простая+сочиал).
  • на момент регистрации пользователь выбирает какой тип аккаунта он хочет зарегать - на пример А и Б.
    данные типы пользователей отличаются не тока по статическим данным профиля но и например у них разные функционалы. в зависимости от этого и регистрационная форма соответствуюшая - разные данные.
    после регистрации попадаешь в свой профиль где все данные.

предположим ты пользователь типа А, авторизуешься, заходишь в профиль и если хочешь поменять тип пользователя то ставишь какой то флажок или что то как то и меняешь и уже в профиле появлаются те данные которые у пользователей типа А нету а те которые были у А и не совпадают с Б исчезают.
Я начал с созданием кастомной модели пользователя наследуемой от AbstarctUser:

=====

class SiteUser(AbstractUser):
is_owner = models.BooleanField( ('AE?'), default=False)
is_client = models.BooleanField(
('Client?'), default=False)

=====

class ProfileClient(models.Model):
profileclient_nickname = models.OneToOneField(SiteUser, on_delete=models.CASCADE, primary_key=True)
profileclient_is_active = models.BooleanField(_("Activ?"), default=False)
profileclient_avatar = models.ImageField("Photo", upload_to="client/", null=True, blank=True,
default='no_image_app_content.png')

=====

class ProfileOwner(models.Model):
profileowner_offname = models.OneToOneField(SiteUser, on_delete=models.CASCADE, primary_key=True)
profileowner_is_active = models.BooleanField(_("Activ?"), default=False)
profileowner_avatar = models.ImageField("Photo", upload_to="owner/", null=True, blank=True,
default='no_image_app_content.png')

=====

в моделях ProfileClient и ProfileOwner есть булевые поля profileclient_is_active и profileowner_is_active соответственно.
про создании профиля из админки, форма состоит из выбрать пользователя, чекбокс для is_active.

в модели SiteUser, есть поле булеевые: is_owner и is_client
про создании пользователя, форма состоит из стандартных юзер, пароль, пароль, а нету в форме чекбокса для is_owner и is_client, а в базе данных есть с значением по умолчании.
может кто обьяснить почему так?

плюс к этому может кто подсказать я иду по правильному пути для реализации данной задачи?
и какие есть другие подходы к реализации данной задумки?

2

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

6
Evgenii Legotckoi
  • Мамыр 15, 2020, 1:24 Т.Қ.
  • (өңделген)

Добрый день.

В общем-то нормальный подход, только я бы повторяющиеся поля перенёс бы в SiteUser, смысла нет в профилях дублировать то, что одинаковое.

Что касается is_owner и is_client , то вам нужно переопределить UserAdmin

admin.py

  1. from django.contrib.auth.admin import UserAdmin
  2.  
  3. class SiteUserAdmin(UserAdmin):
  4. fields = UserAdmin.fields + ['is_owner', 'is_client']
  5.  
  6. admin.site.register(SteUser, SiteUserAdmin)

В целом подход нормальный, если хотите иметь специфические реализации чего-либо.
Я подобное в недавней статье описывал, только для виджетов.

P/S/ и ради всего святого, отредактируйте топик так, чтобы не было этого большого шрифта. Выглядит жутко...

    Evgenii Legotckoi
    • Мамыр 15, 2020, 1:49 Т.Қ.

    К слову, для типо пользователей лучше бы подошёл выбор, типо как здесь

    1. class Widget(models.Model):
    2. HTML = 1
    3. STANDARD = 2
    4. WIDGET_TYPE_CHOICES = (
    5. (HTML, _('HTML Widget')),
    6. (STANDARD, _('Standard Widget')),
    7. )
    8.  
    9. widget_type = models.IntegerField(
    10. verbose_name=_('Widget type'),
    11. choices=WIDGET_TYPE_CHOICES,
    12. default=HTML
    13. )

    А is_owner и is_client можете написать методами.

    Это полезнее в том случае, если в будущем захотите расширить количество типов пользователей

      Nomad
      • Мамыр 15, 2020, 2:18 Т.Қ.
      • (өңделген)

      спасибо за ответ.

      что касаемо переопределения UserAdmin для is_owner и is_client, то ваш синтаксис

      1. fields = UserAdmin.fields + ['is_owner', 'is_client']

      дает ошибку, решил проблему переопределением свойства add_fieldsets из UserAdmin

      1. class SiteCustomUserAdmin(UserAdmin):
      2. add_form = SiteUserCreationForm
      3. form = SiteUserChangeForm
      4.  
      5. UserAdmin.add_fieldsets = (
      6. (None, {
      7. 'classes': ('wide',),
      8. 'fields': ('username', 'password1', 'password2' ),
      9. }),
      10. (_('Account type'), {'fields': ('is_owner', 'is_client')}),
      11. )
      12.  
      13. model = SiteUser
      14. # fields = UserAdmin.fields + ['is_owner', 'is_client']
      15. list_display = ['id', 'username', 'email', 'date_joined', 'is_owner', 'is_client', ]
      16. list_display_links = ('username',)
        Evgenii Legotckoi
        • Мамыр 15, 2020, 2:22 Т.Қ.

        А точно, там же fieldsets, одновременно нельзя определять fieldsets и fields. Ну ок ))

          Nomad
          • Мамыр 15, 2020, 2:25 Т.Қ.

          а зачем в вашем коде вот эти строки????

          1. class EmailBlackListEntryAdmin(admin.ModelAdmin):
          2. search_fields = ['email']

          ??????

            Evgenii Legotckoi
            • Мамыр 15, 2020, 2:27 Т.Қ.
            • Жауап шешім ретінде белгіленді.

            я уже отредактировал и убрал это из сообщения.. не обращайте внимания, у меня это был кусок кода из сайта, там своя дополнительная логика для борьбы со спамерами.

              Пікірлер

              Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
              Кіріңіз немесе Тіркеліңіз