Maison  >  Article  >  développement back-end  >  Compétences en système de gestion backend dans le framework Django (Partie 2)

Compétences en système de gestion backend dans le framework Django (Partie 2)

王林
王林original
2023-06-17 19:09:08867parcourir

Compétences du système de gestion backend dans le framework Django (Partie 2)

Dans l'article précédent, nous avons présenté certaines compétences du système de gestion backend dans le framework Django, telles que comment personnaliser la mise en page d'arrière-plan, comment personnaliser les filtres, comment personnaliser les actions, etc. Cet article continuera à présenter des conseils plus pratiques pour vous aider à mieux utiliser le framework Django.

  1. Comment gérer la valeur par défaut de ForeignKey dans le modèle

Dans Django Model, ForeignKey est un type de champ très pratique. Cependant, lorsque nous créons une nouvelle instance de modèle, le champ de type ForeignKey doit spécifier une instance du modèle associé afin d'être enregistré avec succès. Si elles ne sont pas spécifiées, les valeurs NULL seront enregistrées par défaut. Dans certains cas, nous pouvons souhaiter que le champ de type ForeignKey soit enregistré dans une instance d'association par défaut. Dans ce cas, nous pouvons utiliser la méthode get_or_create de Django.

Par exemple, nous avons un modèle de produit et définissons un champ ProductCategory ForeignKey pour celui-ci. Nous souhaitons associer automatiquement une instance de catégorie par défaut lorsque nous créons une nouvelle instance de produit. Nous pouvons ajouter le code suivant au modèle :

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

In. de cette façon, lorsque nous créons une nouvelle instance Product, une instance ProductCategory nommée "Default Category" sera automatiquement associée par défaut.

  1. Comment restreindre un modèle dans le système de gestion en arrière-plan pour ne créer qu'une seule instance ?

Dans certains cas, nous pouvons souhaiter qu'un modèle crée une seule instance, comme les paramètres globaux du site Web. À l'heure actuelle, vous pouvez utiliser la bibliothèque SingletonModel de Django, qui fournit un BaseSingletonModel qui nous permet de convertir facilement n'importe quel modèle en modèle Singleton.

Par exemple, nous avons un modèle GlobalSettings et espérons qu'il ne pourra créer qu'une seule instance. Il peut être défini comme ceci :

from singleton_models.models import SingletonModel

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

Après l'avoir défini, dans le système de gestion en arrière-plan, nous ne pouvons créer et modifier qu'une seule instance GlobalSettings.

  1. Comment ajouter un middleware personnalisé au système de gestion backend

Dans le framework Django, le middleware est un intercepteur utilisé pour gérer les requêtes et les réponses. Il peut gérer la demande ou la réponse avant que la demande n'atteigne la fonction d'affichage, après que la fonction d'affichage ait traité la demande et avant que la réponse ne soit envoyée au client. Parmi eux, l'ajout d'un middleware personnalisé au système de gestion en arrière-plan nous permet d'intercepter et de traiter facilement les opérations de l'administrateur.

Par exemple, si nous souhaitons que l'administrateur doive saisir un mot de passe de confirmation secondaire lors de certaines opérations de modification, nous pouvons ajouter le code suivant au fichier settings.py du projet Django :

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

Dans le code ci-dessus, nous définissez un ConfirmPasswordMiddleware, il interceptera la demande avant qu'elle n'atteigne la fonction d'affichage et déterminera si un deuxième mot de passe de confirmation est requis. CONFIRMED_ACTIONS est une liste de fonctions d'affichage qui nécessitent une confirmation secondaire. Nous pouvons les ajouter ou les supprimer selon nos besoins. Dans la fonction d'affichage, nous pouvons demander si l'utilisateur actuel a saisi le mot de passe de confirmation secondaire via request.session.get('password_confirmed', False).

  1. Comment ajouter un sérialiseur au Modèle du système de gestion backend

Dans le framework Django, Serializer est une classe utilisée pour convertir le Modèle en dictionnaire ou au format JSON. L'ajout d'un sérialiseur au système de gestion backend nous permet de convertir facilement le modèle au format JSON et de le sortir.

Par exemple, nous avons un modèle de produit et souhaitons le convertir au format JSON et le sortir dans le système de gestion en arrière-plan. Il peut être défini comme ceci :

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)

Dans le code ci-dessus, nous avons ajouté une fonction export_as_json à ProductAdmin, qui peut L'instance de modèle actuellement sélectionnée est convertie au format JSON et envoyée au client. Dans le même temps, nous avons également ajouté une fonction my_view à ProductAdmin, qui peut directement interroger toutes les instances de modèle et les convertir en sortie au format JSON.

Résumé

Le système de gestion d'arrière-plan du framework Django est un outil important pour le développement d'applications Web. Il fournit de nombreuses fonctions prêtes à l'emploi qui nous permettent de gérer facilement les instances de modèle, les modifications et les suppressions par lots. Dans cet article, nous présentons quelques conseils pratiques pour le système de gestion back-end du framework Django, notamment comment gérer la valeur par défaut de ForeignKey dans le modèle, comment limiter un modèle dans le système de gestion back-end pour ne créer qu'une seule instance et comment ajouter personnalisation du système de gestion backend. Définir le middleware et comment ajouter des sérialiseurs au modèle du système de gestion backend. Grâce à l'utilisation de ces techniques, nous pouvons mieux utiliser le système de gestion d'arrière-plan du framework Django.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn