Evgenii Legotckoi
Evgenii Legotckoi26. April 2020 15:08

Django - Tutorial 052. Neudefinition eines Benutzermodells

Es gibt verschiedene Möglichkeiten, mit dem Benutzermodell zu arbeiten, um ein Benutzerprofil zu erstellen und bestimmte Informationen hinzuzufügen, z. B. ein Profilfoto. Eine Möglichkeit besteht darin, ein Profilmodell mit einem OneToOneField für den Benutzer hinzuzufügen. Diese Option ist einfacher als das Proxying eines Modells oder das Überschreiben eines benutzerdefinierten Modells. Aber für mich persönlich hat sich die Neudefinition des Benutzermodells als effizienter erwiesen, was das Organisieren von Code und das Schreiben verschiedener Methoden betrifft, mit denen Sie die erforderlichen Informationen aus dem Benutzerobjekt in Vorlagen extrahieren können, ohne auf das Schreiben von Vorlagen-Tags zurückgreifen zu müssen.

Daher werden wir genau die Möglichkeit prüfen, das Benutzermodell in einem Django-Projekt zu überschreiben


Einführung

Als Einstieg möchte ich darauf hinweisen, dass es besser ist, das Benutzermodell ganz am Anfang des Projekts neu zu definieren, da es sonst zu Problemen bei Migrationen kommen kann, die manuell behoben werden müssen.

Ich selbst habe die Neudefinition des Benutzermodells bereits vorgenommen, als die Seite mehr als zwei Jahre bestand. Mein Überschreibungsprozess verlief jedoch relativ reibungslos, zumindest kann ich mich nicht erinnern, irgendwelche Probleme mit dem Überschreiben eines benutzerdefinierten Modells gehabt zu haben.

Neudefinition eines benutzerdefinierten Modells

Um das Benutzermodell korrekt zu überschreiben, müssen Sie das abstrakte Benutzermodell AbstractUser importieren und davon in der Anwendung erben, in der Sie das Modell haben werden.

In meiner App evileg_auth habe ich das so gemacht

# -*- coding: utf-8 -*-

from django.contrib.auth.models import AbstractUser


class User(AbstractUser):
    pass

Als nächstes müssen Sie dieses Modell als neues benutzerdefiniertes Modell in der Einstellungsdatei settings.py angeben.

AUTH_USER_MODEL = 'evileg_auth.User'

Dies ist erforderlich, damit eine Drittanbieteranwendung Ihr benutzerdefiniertes Modell anstelle des Standardmodells verwenden kann.

Anschließend können Sie Migrationen erstellen und das Projekt migrieren

python manage.py makemigrations
python manage.py migrate

Vergessen Sie auch nicht, Ihr Modell im Admin-Bereich zu registrieren

# -*- coding: utf-8 -*-

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin

from .models import User

admin.site.register(User, UserAdmin)

Anmerkungen

Wenn Sie ein überschriebenes benutzerdefiniertes Modell in ein vorhandenes Projekt implementieren, empfehle ich Ihnen, die folgenden Schritte auszuführen, um sicherzustellen, dass das überschriebene Modell in Ihrem gesamten Projekt verwendet wird.

Einstellungen.AUTH_USER_MODEL

Verwenden Sie in allen models.py -Dateien die Variable settings.AUTH_USER_MODEL aus den Einstellungen anstelle des Standardmodells.

# -*- coding: utf-8 -*-

from django.conf import settings
from django.db import models


class SomeModel(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name='User')

get_user_model()

Überall in Ihrem Code, der davon ausgeht, dass bereits eine Django-Instanz ausgeführt wird, verwenden Sie das dynamische Abrufen der Benutzermodellklasse über get_user_model()

Ich habe zum Beispiel dieses Mixin

class EInUserProfileMixin:
    user_profile = None

    def dispatch(self, request, *args, **kwargs):
        self.user_profile = get_object_or_404(get_user_model(), username=kwargs['user'], is_active=True)
        return super().dispatch(request, *args, **kwargs)

Anwendung von Drittanbietern

Wenn Sie eine Drittanbieteranwendung schreiben, sollten die Empfehlungen im Abschnitt „Hinweise“ für Sie obligatorisch sein, da Ihre Drittanbieteranwendung sonst für die Entwickler nutzlos ist, die benutzerdefinierte Modelle in ihren Django -Projekten überschreiben

Vorteile des Überschreibens eines benutzerdefinierten Modells

Das Überschreiben des Benutzermodells hat meiner Meinung nach große Vorteile gegenüber der Verwendung von OneToOneField, da Sie damit den Objektmanager ohne Krücken überschreiben und auch eine Reihe von Methoden hinzufügen können, die in Ihrem Projekt nützlich sein können. Und auch diese Methoden können in Templates aufgerufen werden, ohne Template-Tags zu schreiben.

Hier ist ein Beispiel für ein benutzerdefiniertes Modellteil in meinem Projekt

class User(AbstractUser):

    last_online = models.DateTimeField(blank=True, null=True)

    objects = UserManager()

    class Meta:
        ordering = ['username']

    def get_absolute_url(self):
        return reverse('users:profile', kwargs={'user': self.username})

Zumindest habe ich es immer versäumt, die Standardmethode get_absolute_url für ein Benutzerprofil auf einer Website zu verwenden.

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

Полезный урок, весьма лучше, чем создать профиль. А как всё это объединить в админке? admin.site.register(User, UserAdmin) - UserAdmin убрал мое созданное поле для абстрактного поля.

Я немного не понял, что именно вы хотите объединить? Вы хотите, чтобы группы и пользователи были в одном groupbox'e?
Или хотите видеть абстрактное поле? Если абстрактное поле, то наследуйтесь от UserAdmin и переопределите переменные fields и т.д., как если бы наследовались от ModelAdmin

Я уже нашел в вашем другом уроке как добавить поле аватар к пользователям. Именно то что вы написали) Спасяб:3
Да ещё бы хотелось чтоб группы и пользователи были в одной группе.

Да ещё бы хотелось чтоб группы и пользователи были в одной группе.

Насчёт такого никогда не заморачивался, мне это не мешало. Но вообще для этого можно использовать прокси модель.

Думаю, что это может выглядеть так

class ProxyGroups(Groups):
    class Meta:
        proxy = True    
        # Если определить ProxyGroup внутри my_auth/models.py,
        # то его app_label будет установлен как 'my_auth' автоматически.
        # Или можно переопределить его так           
        # app_label = 'my_auth'

        # также можно установить некоторые параметры из существующего Group
        # verbose_name = Groups._meta.verbose_name
        # verbose_name_plural = Groups._meta.verbose_name_plural


# in admin.py
admin.site.register(ProxyGroups)

Суть в том, что проксируем стандартную модель Groups в другое приложение, чтобы они отображались в одном app

Благодарю!

Z M
  • 4. Mai 2020 05:56

Подскажите, эта серия уроков для django 2.0?

Evgenii Legotckoi
  • 4. Mai 2020 05:59
  • (bearbeitet)

Я ещё не переходил на Django 3, поэтому на данный момент все примеры пишутся с использованием Django 2, наиболее старые с использованием Django 1.

Но в принципе, большая часть из статей должна работать и с Django 3. Хотя и не все.

Z M
  • 4. Mai 2020 06:02

Понял, большое спасибо! Буду ждать перехода на 3 версию :)

Evgenii Legotckoi
  • 4. Mai 2020 06:04

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

t
  • 23. Januar 2021 08:28

Добрый день, Я вот написал в admin.py
admin.site.register(User, UserAdmin)
Но у меня не появилось новые поля в админке?

Evgenii Legotckoi
  • 31. Januar 2021 16:30

Если у вашего пользователя нет прав но чтение или изменение модели пользователя, то вы можете и не увидеть эту модель в админке. В этом случае лучше под суперпользователем проверять всё.

t
  • 23. Februar 2021 07:11

А как дать ему эти права?

t
  • 24. Februar 2021 02:56

В данном случае я заходил под superuser но все равно не появлялись эти поля

N
  • 19. April 2022 03:22

def initials(self):
return get_initials(self)

В последнем листинге что такое get_initials(self), пайчарм подчеркивает и предлагает создать функцию get_initials

Evgenii Legotckoi
  • 19. April 2022 03:58

Лишний кусок кода (Метод для получения инициалов), удалите его.

Kommentare

Nur autorisierte Benutzer können Kommentare posten.
Bitte Anmelden oder Registrieren
Letzte Kommentare
ИМ
Игорь Максимов5. Oktober 2024 07:51
Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55. Juli 2024 11:02
QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr8. Februar 2024 18:43
Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25. Dezember 2023 10:30
Boost - statisches Verknüpfen im CMake-Projekt unter Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
Jetzt im Forum diskutieren
J
JacobFib17. Oktober 2024 03:27
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
JW
Jhon Wick1. Oktober 2024 15:52
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
КГ
Кирилл Гусарев27. September 2024 09:09
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
F
Fynjy22. Juli 2024 04:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

Folgen Sie uns in sozialen Netzwerken