Nomad
Nomad15 мая 2020 г. 3: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, а в базе данных есть с значением по умолчании.
может кто обьяснить почему так?

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

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

6
Evgenii Legotckoi
  • 15 мая 2020 г. 3:24
  • (ред.)

Добрый день.

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

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

admin.py

from django.contrib.auth.admin import UserAdmin

class SiteUserAdmin(UserAdmin):
    fields = UserAdmin.fields + ['is_owner', 'is_client']

admin.site.register(SteUser, SiteUserAdmin)

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

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

    Evgenii Legotckoi
    • 15 мая 2020 г. 3:49

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

    class Widget(models.Model):
        HTML = 1
        STANDARD = 2
        WIDGET_TYPE_CHOICES = (
            (HTML, _('HTML Widget')),
            (STANDARD, _('Standard Widget')),
        )
    
        widget_type = models.IntegerField(
            verbose_name=_('Widget type'),
            choices=WIDGET_TYPE_CHOICES,
            default=HTML
        )
    

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

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

      Nomad
      • 15 мая 2020 г. 4:18
      • (ред.)

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

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

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

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

      class SiteCustomUserAdmin(UserAdmin):
          add_form = SiteUserCreationForm
          form = SiteUserChangeForm
      
          UserAdmin.add_fieldsets = (
              (None, {
                  'classes': ('wide',),
                  'fields': ('username', 'password1', 'password2' ),
              }),
              (_('Account type'), {'fields': ('is_owner', 'is_client')}),
          )
      
          model = SiteUser
          # fields = UserAdmin.fields + ['is_owner', 'is_client']
          list_display = ['id', 'username', 'email', 'date_joined', 'is_owner', 'is_client', ]
          list_display_links = ('username',)
      
        Evgenii Legotckoi
        • 15 мая 2020 г. 4:22

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

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

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

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

          ??????

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

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

              Комментарии

              Только авторизованные пользователи могут публиковать комментарии.
              Пожалуйста, авторизуйтесь или зарегистрируйтесь
              e
              • ehot
              • 31 марта 2024 г. 21:29

              C++ - Тест 003. Условия и циклы

              • Результат:78баллов,
              • Очки рейтинга2
              B

              C++ - Тест 002. Константы

              • Результат:16баллов,
              • Очки рейтинга-10
              B

              C++ - Тест 001. Первая программа и типы данных

              • Результат:46баллов,
              • Очки рейтинга-6
              Последние комментарии
              k
              kmssr9 февраля 2024 г. 2:43
              Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
              АК
              Анатолий Кононенко5 февраля 2024 г. 9:50
              Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
              EVA
              EVA25 декабря 2023 г. 18:30
              Boost - статическая линковка в CMake проекте под Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
              J
              JonnyJo25 декабря 2023 г. 16:38
              Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
              G
              Gvozdik19 декабря 2023 г. 5:01
              Qt/C++ - Урок 056. Подключение библиотеки Boost в Qt для компиляторов MinGW и MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
              Сейчас обсуждают на форуме
              a
              a_vlasov14 апреля 2024 г. 13:41
              Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Евгений, добрый день! Такой вопрос. Верно ли следующее утверждение: Любое Android-приложение, написанное на Java/Kotlin чисто теоретически (пусть и с большими трудностями) можно написать и на C+…
              Павел Дорофеев
              Павел Дорофеев14 апреля 2024 г. 9:35
              QTableWidget с 2 заголовками Вот тут есть кастомный QTableView с многорядностью проект поддерживается, обращайтесь
              f
              fastrex4 апреля 2024 г. 11:47
              Вернуть старое поведение QComboBox, не менять индекс при resetModel Добрый день! У нас много проектов в которых используется QComboBox, в версии 5.5.1, когда модель испускает сигнал resetModel, currentIndex не менялся. В версии 5.15 при resetModel происходит try…
              P
              Pisych27 февраля 2023 г. 12:04
              Как получить в массив значения из связанной модели? Спасибо, разобрался:))
              AC
              Alexandru Codreanu19 января 2024 г. 19:57
              QML Обнулить значения SpinBox Доброго времени суток, не могу разобраться с обнулением значение SpinBox находящего в делегате. import QtQuickimport QtQuick.ControlsWindow { width: 640 height: 480 visible: tr…

              Следите за нами в социальных сетях