أضف وظائف إلى Django FlatPages دون تغيير تطبيق Django الأصلي
-
06-07-2019 - |
سؤال
أرغب في إضافة حقل إلى نموذج قاعدة بيانات Django FlatPage، لكنني لا أعرف حقًا كيفية توسيع هذا دون تحرير التطبيق الأصلي.
ما أريد فعله هو إضافة الحقل التالي إلى النموذج:
from django.db import models
from django.contrib.flatpages.models import FlatPage as FlatPageOld
class FlatPage(FlatPageOld):
order = models.PositiveIntegerField(unique=True)
كيف يمكنني إضافة هذا إلى نموذج FlatPage؟
شكرا لك مقدما
المحلول
ونهجكم على ما يرام - أنت فقط لا نرى النتيجة ليتم تسجيل نموذج flatpage القديم في الادارة وواحدة جديدة ليست كذلك. إليك ما قد يفعله في admin.py التطبيق الجديد الخاص بك (باستخدام تسمية أقل غموضا من ما كنت قد حصلت أعلاه):
from django.contrib import admin
from django.contrib.flatpages.admin import FlatPageAdmin
from django.contrib.flatpages.forms import FlatpageForm
from django.contrib.flatpages.models import FlatPage
from models import ExtendedFlatPage
class ExtendedFlatPageForm(FlatpageForm):
class Meta:
model = ExtendedFlatPage
class ExtendedFlatPageAdmin(FlatPageAdmin):
form = ExtendedFlatPageForm
fieldsets = (
(None, {'fields': ('url', 'title', 'content', 'sites', 'order')}),
)
admin.site.unregister(FlatPage)
admin.site.register(ExtendedFlatPage, ExtendedFlatPageAdmin)
والواضح أن هناك عدد قليل من الأشياء التي تجري هنا، ولكن الأهم من طراز FlatPage يجري غير مسجلة ويتم تسجيله نموذج ExtendedFlatPage في مكانها.
نصائح أخرى
والطريقة في رسالتك لا تعمل لأن ...؟
إذا كنت لسبب ما حقًا إذا كنت بحاجة إلى التلاعب بفئة FlatPage المضمنة وتحريرها ديناميكيًا، فيمكنك ربطها بالإشارة class_prepared:
http://docs.djangoproject.com/en/dev/ref/signals/#class-prepared
يحرر
إليك كيفية القيام بذلك باستخدام class_prepared:
from django.db.models.signals import class_prepared
from django.db import models
def alter_flatpages(sender, **kwargs):
if sender.__module__ == 'django.contrib.flatpages.models' and sender.__name__ == 'FlatPage':
order = models.IntegerField()
order.contribute_to_class(sender, 'order')
class_prepared.connect(alter_flatpages)
ضع هذا، على سبيل المثال، "signals.py" في نفس الدليل مثل settings.py الخاص بك، وأضف "signals" إلى قمة (وهذا أمر مهم، للتأكد من تثبيت معالج الإشارة في الوقت المناسب) من قائمة INSTALLED_APPS.
ومع ذلك، لن يؤدي ذلك إلى عرض الحقل في المسؤول، نظرًا لوجود فئة ModelAdmin مخصصة لـ FlatPages والتي تسرد الحقول بشكل صريح.لذلك بعد تسجيله في تطبيق flatpages، ستحتاج إلى إلغاء تسجيله في مكان ما (admin.site.unregister) وتسجيل ModelAdmin خاص بك.