Kenntnisse im Backend-Managementsystem im Django-Framework (Teil 2)

王林
Freigeben: 2023-06-17 19:09:08
Original
931 Leute haben es durchsucht

Backend-Managementsystem-Fähigkeiten im Django-Framework (Teil 2)

Im vorherigen Artikel haben wir einige Backend-Managementsystem-Fähigkeiten im Django-Framework vorgestellt, z. B. wie man das Layout der Hintergrundseite anpasst, wie man Filter anpasst, wie man benutzerdefinierte Aktionen durchführt, usw. In diesem Artikel werden weitere praktische Tipps vorgestellt, die Ihnen helfen, das Django-Framework besser zu nutzen.

  1. So gehen Sie mit dem Standardwert von ForeignKey im Modell um

Im Django-Modell ist ForeignKey ein sehr praktischer Feldtyp. Wenn wir jedoch eine neue Modellinstanz erstellen, muss das ForeignKey-Typfeld eine Instanz des zugehörigen Modells angeben, damit es erfolgreich gespeichert werden kann. Wenn nicht angegeben, werden NULL-Werte standardmäßig gespeichert. In einigen Fällen möchten wir möglicherweise, dass das Feld vom Typ ForeignKey in einer Standardzuordnungsinstanz gespeichert wird. In diesem Fall können wir die Methode get_or_create von Django verwenden.

Zum Beispiel haben wir ein Produktmodell und definieren dafür ein ProductCategory-ForeignKey-Feld. Wir möchten automatisch eine Standardkategorieinstanz zuordnen, wenn wir eine neue Produktinstanz erstellen. Wir können dem Modell den folgenden Code hinzufügen:

class Product(models.Model):
    name = models.CharField(max_length=100)
    category = models.ForeignKey(ProductCategory, default=get_default_category)

   def get_default_category():
        """
        返回默认的ProductCategory实例或者创建一个新的实例
        """
        category, _ = ProductCategory.objects.get_or_create(name='Default Category')
        return category
Nach dem Login kopieren

In Auf diese Weise wird beim Erstellen einer neuen Produktinstanz standardmäßig automatisch eine ProductCategory-Instanz mit dem Namen „Standardkategorie“ zugeordnet.

  1. Wie kann man ein Modell im Hintergrundverwaltungssystem darauf beschränken, nur eine Instanz zu erstellen?

In manchen Fällen möchten wir möglicherweise, dass ein Modell nur eine Instanz erstellt, beispielsweise bei globalen Einstellungen auf einer Website. Zu diesem Zeitpunkt können Sie die SingletonModel-Bibliothek von Django verwenden, die ein BaseSingletonModel bereitstellt, mit dem wir jedes Modell problemlos in ein Singleton-Modell konvertieren können.

Zum Beispiel haben wir ein GlobalSettings-Modell und hoffen, dass es nur eine Instanz erstellen kann. Es kann wie folgt definiert werden:

from singleton_models.models import SingletonModel

class GlobalSettings(SingletonModel):
    site_name = models.CharField(max_length=100, default='')
    site_url = models.URLField(default='')
    # 其他全局设置字段
Nach dem Login kopieren

Nachdem wir es definiert haben, können wir im Hintergrundverwaltungssystem nur eine GlobalSettings-Instanz erstellen und bearbeiten.

  1. So fügen Sie benutzerdefinierte Middleware zum Backend-Managementsystem hinzu

Im Django-Framework ist Middleware ein Interceptor, der zur Verarbeitung von Anfragen und Antworten verwendet wird. Es kann die Anfrage oder Antwort verarbeiten, bevor die Anfrage die Ansichtsfunktion erreicht, nachdem die Ansichtsfunktion die Anfrage verarbeitet hat und bevor die Antwort an den Client gesendet wird. Unter anderem ermöglicht uns das Hinzufügen benutzerdefinierter Middleware zum Hintergrundverwaltungssystem, die Vorgänge des Administrators einfach abzufangen und zu verarbeiten.

Wenn wir beispielsweise möchten, dass der Administrator bei bestimmten Änderungsvorgängen ein sekundäres Bestätigungskennwort eingeben muss, können wir der Datei „settings.py“ des Django-Projekts den folgenden Code hinzufügen:

MIDDLEWARE = [
    # 默认的中间件
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    # 自定义中间件
    'myapp.middleware.ConfirmPasswordMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

CONFIRMED_ACTIONS = (
    'myapp.views.EditProductView',
    'myapp.views.DeleteProductView',
)

class ConfirmPasswordMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # 根据请求的URL判断是哪个视图函数,如果是CONFIRMED_ACTIONS中的视图函数,需要做二次确认
        view_func = resolve(request.path_info).func
        if view_func and view_func.__module__ + "." + view_func.__name__ in CONFIRMED_ACTIONS:
            if not request.session.get('password_confirmed', False):
                # 没有输入二次确认密码,跳转到输入页面
                return redirect(reverse('confirm-password'))

        response = self.get_response(request)

        return response
Nach dem Login kopieren

Im obigen Code haben wir Definieren Sie eine ConfirmPasswordMiddleware. Sie fängt die Anfrage ab, bevor sie die Ansichtsfunktion erreicht, und bestimmt, ob ein zweites Bestätigungskennwort erforderlich ist. CONFIRMED_ACTIONS ist eine Liste von Ansichtsfunktionen, die eine sekundäre Bestätigung erfordern. Wir können sie nach Bedarf hinzufügen oder löschen. In der Ansichtsfunktion können wir über request.session.get('password_confirmed', False) abfragen, ob der aktuelle Benutzer das sekundäre Bestätigungskennwort eingegeben hat.

  1. So fügen Sie dem Modell des Backend-Managementsystems einen Serializer hinzu

Im Django-Framework ist Serializer eine Klasse, die zum Konvertieren des Modells in ein Wörterbuch- oder JSON-Format verwendet wird. Durch das Hinzufügen eines Serialisierers zum Backend-Managementsystem können wir das Modell einfach in das JSON-Format konvertieren und ausgeben.

Zum Beispiel haben wir ein Produktmodell und möchten es in das JSON-Format konvertieren und im Hintergrundverwaltungssystem ausgeben. Es kann wie folgt definiert werden:

from django.contrib import admin
from django.core.serializers import serialize
from django.http import HttpResponse

class ProductAdmin(admin.ModelAdmin):
    # 列表视图显示的字段列表
    list_display = ('name', 'price', 'category')

    # 自定义action函数
    def export_as_json(self, request, queryset):
        response = HttpResponse(content_type="application/json")
        serializers.serialize("json", queryset, stream=response)
        return response
    export_as_json.short_description = "导出为JSON"

    # 自定义函数按钮
    change_list_template = 'admin/myapp/product/list.html'

    def get_urls(self):
        urls = super().get_urls()
        my_urls = [
            path('my_view/', self.my_view),
        ]
        return my_urls + urls

    def my_view(self, request):
        data = serialize('json', Product.objects.all())
        return JsonResponse(data, safe=False)

admin.site.register(Product, ProductAdmin)
Nach dem Login kopieren

Im obigen Code haben wir ProductAdmin eine export_as_json-Funktion hinzugefügt. Das kann Die aktuell ausgewählte Modellinstanz wird in das JSON-Format konvertiert und an den Client ausgegeben. Gleichzeitig haben wir ProductAdmin auch eine my_view-Funktion hinzugefügt, die alle Modellinstanzen direkt abfragen und in die Ausgabe im JSON-Format konvertieren kann.

Zusammenfassung

Das Hintergrundverwaltungssystem des Django-Frameworks ist ein wichtiges Werkzeug für die Entwicklung von Webanwendungen. Es bietet viele vorgefertigte Funktionen, mit denen wir Modellinstanzen, Stapeländerungen und Löschungen einfach verwalten können. In diesem Artikel stellen wir einige praktische Tipps für das Backend-Verwaltungssystem des Django-Frameworks vor, darunter den Umgang mit dem Standardwert von ForeignKey im Modell, die Beschränkung eines Modells im Backend-Verwaltungssystem auf die Erstellung nur einer Instanz und das Hinzufügen Anpassung an das Backend-Managementsystem. Definieren Sie Middleware und wie Sie Serialisierer zum Modell des Backend-Managementsystems hinzufügen. Durch den Einsatz dieser Techniken können wir das Hintergrundverwaltungssystem des Django-Frameworks besser nutzen.

Das obige ist der detaillierte Inhalt vonKenntnisse im Backend-Managementsystem im Django-Framework (Teil 2). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage