Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Kemahiran sistem pengurusan bahagian belakang dalam rangka kerja Django (Bahagian 2)

Kemahiran sistem pengurusan bahagian belakang dalam rangka kerja Django (Bahagian 2)

王林
王林asal
2023-06-17 19:09:08867semak imbas

Kemahiran sistem pengurusan belakang dalam rangka kerja Django (Bahagian 2)

Dalam artikel sebelumnya, kami memperkenalkan beberapa kemahiran sistem pengurusan bahagian belakang dalam rangka kerja Django, seperti cara menyesuaikan reka letak halaman latar belakang, cara untuk Penapis tersuai, cara menyesuaikan tindakan, dsb. Artikel ini akan terus memperkenalkan lebih banyak petua praktikal untuk membantu anda menggunakan rangka kerja Django dengan lebih baik.

  1. Cara menangani nilai lalai ForeignKey dalam Model

Dalam Model Django, ForeignKey ialah jenis medan yang sangat praktikal. Walau bagaimanapun, apabila kami mencipta contoh Model baharu, medan jenis ForeignKey perlu menentukan tika Model berkaitan untuk disimpan dengan jayanya. Jika tidak dinyatakan, nilai NULL akan disimpan secara lalai. Dalam sesetengah kes, kami mungkin mahu medan jenis ForeignKey disimpan dalam contoh perkaitan lalai Dalam kes ini, kami boleh menggunakan kaedah get_or_create Django.

Sebagai contoh, kami mempunyai Model Produk dan mentakrifkan medan ProductCategory ForeignKey untuknya. Kami berharap apabila kami mencipta tika Produk baharu, ia akan mengaitkan tika Kategori lalai secara automatik the Model :

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

Dengan cara ini, apabila kami mencipta tika Produk baharu, tika ProductCategory bernama "Kategori Lalai" akan dikaitkan secara automatik secara lalai.

  1. Cara untuk mengehadkan Model dalam sistem pengurusan latar belakang untuk hanya mencipta satu contoh

Dalam sesetengah kes, kami mungkin mahu Model mencipta hanya satu contoh, seperti dalam tetapan Global tapak web. Pada masa ini, anda boleh menggunakan perpustakaan SingletonModel Django, yang menyediakan BaseSingletonModel yang membolehkan kami menukar mana-mana Model kepada Model Singleton dengan mudah.

Sebagai contoh, kami mempunyai Model GlobalSettings dan berharap ia hanya boleh mencipta satu contoh Ia boleh ditakrifkan seperti ini:

from singleton_models.models import SingletonModel

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

Selepas ia ditakrifkan, dalam sistem pengurusan latar belakang, kami. hanya boleh membuat dan mengedit contoh GlobalSettings.

  1. Cara menambah perisian tengah tersuai pada sistem pengurusan bahagian belakang

Dalam rangka kerja Django, perisian tengah ialah pemintas yang digunakan untuk memproses permintaan dan respons. Ia boleh mengendalikan permintaan atau respons sebelum permintaan mencapai fungsi paparan, selepas fungsi pandangan mengendalikan permintaan, dan sebelum respons dihantar kepada klien. Antaranya, menambahkan perisian tengah tersuai pada sistem pengurusan latar belakang membolehkan kami memintas dan memproses operasi pentadbir dengan mudah.

Sebagai contoh, jika kami mahu pentadbir perlu memasukkan kata laluan pengesahan sekunder semasa membuat operasi pengubahsuaian tertentu, kami boleh menambah kod berikut pada fail settings.py projek 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

Kod di atas, kami mentakrifkan ConfirmPasswordMiddleware, yang memintas permintaan sebelum ia mencapai fungsi paparan dan menentukan sama ada kata laluan pengesahan kedua diperlukan. CONFIRMED_ACTIONS ialah senarai fungsi paparan yang memerlukan pengesahan kedua Kami boleh menambah atau memadamnya mengikut keperluan. Dalam fungsi paparan, kami boleh bertanya sama ada pengguna semasa telah memasukkan kata laluan pengesahan kedua melalui request.session.get('password_confirmed', False).

  1. Cara menambah serializer pada Model sistem pengurusan backend

Dalam rangka kerja Django, Serializer ialah kelas yang digunakan untuk menukar Model kepada kamus atau format JSON. Menambah penyeri pada sistem pengurusan bahagian belakang membolehkan kami menukar Model kepada format JSON dan mengeluarkannya dengan mudah.

Sebagai contoh, kami mempunyai Model Produk dan ingin menukarnya kepada format JSON dan mengeluarkannya dalam sistem pengurusan latar belakang Ia boleh ditakrifkan seperti ini:

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)

Dalam kod di atas, kami menambah Fungsi export_as_json disediakan, yang boleh menukar contoh Model yang dipilih pada masa ini ke dalam format JSON dan mengeluarkannya kepada klien. Pada masa yang sama, kami juga menambahkan fungsi my_view pada ProductAdmin, yang boleh menanyakan secara terus semua tika Model dan menukarnya kepada output format JSON.

Ringkasan

Sistem pengurusan latar belakang rangka kerja Django ialah alat penting untuk membangunkan aplikasi web Ia menyediakan banyak fungsi sedia yang membolehkan kami mengurus contoh Model, pengubahsuaian kelompok dan pemadaman . Dalam artikel ini, kami memperkenalkan beberapa petua praktikal untuk sistem pengurusan bahagian belakang rangka kerja Django, termasuk cara mengendalikan nilai lalai ForeignKey dalam Model, cara mengehadkan Model dalam sistem pengurusan bahagian belakang untuk membuat satu contoh sahaja dan cara menambah penyesuaian kepada sistem pengurusan bahagian belakang Tentukan perisian tengah dan cara menambah penyeri pada Model sistem pengurusan bahagian belakang. Melalui penggunaan teknik ini, kita boleh menggunakan sistem pengurusan latar belakang rangka kerja Django dengan lebih baik.

Atas ialah kandungan terperinci Kemahiran sistem pengurusan bahagian belakang dalam rangka kerja Django (Bahagian 2). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn