Nomad
15 мая 2020 г. 13: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 г. 13: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 г. 13: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 г. 14: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 г. 14:22

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

          Nomad
          • 15 мая 2020 г. 14:25

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

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

          ??????

            Evgenii Legotckoi
            • 15 мая 2020 г. 14:27
            • Ответ был помечен как решение.

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

              Комментарии

              Только авторизованные пользователи могут публиковать комментарии.
              Пожалуйста, авторизуйтесь или зарегистрируйтесь
              • Последние комментарии
              • IscanderChe
                12 апреля 2025 г. 17:12
                Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
              • AK
                1 апреля 2025 г. 11:41
                Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
              • Evgenii Legotckoi
                9 марта 2025 г. 21:02
                К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
              • VP
                9 марта 2025 г. 16:14
                Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
              • ИМ
                22 ноября 2024 г. 21:51
                Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…