أضف وظائف إلى Django FlatPages دون تغيير تطبيق Django الأصلي

StackOverflow https://stackoverflow.com/questions/1021487

سؤال

أرغب في إضافة حقل إلى نموذج قاعدة بيانات 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 خاص بك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top