سؤال

وأنا على أمل لتحديث الطبقة الفوقية المضمنة في ModelForm بشكل حيوي من وجهة نظري. على الرغم من أن هذا الرمز يبدو لتحديث القائمة في الطبقة الفوقية، والإخراج من as_p()، as_ul()، الخ استثناء لا يعكس ميتا تحديث استبعادها.

وأفترض ثم أن يتم إنشاء أتش تي أم أل عندما يتم إنشاء ModelForm لا عندما يتم استدعاء as_*(). هل هناك وسيلة لفرض التحديث من HTML؟

هل هذا حتى أفضل طريقة للقيام بذلك؟ أنا فقط يفترض هذا <م> يجب العمل.

والأفكار؟

from django.forms import ModelForm

from testprogram.online_bookings.models import Passenger

class PassengerInfoForm(ModelForm):

    def set_form_excludes(self, exclude_list):
        self.Meta.exclude = excludes_list

    class Meta:
        model = Passenger
        exclude = []
هل كانت مفيدة؟

المحلول

ويتم استخدام الفئة ميتا لبناء تعريف نموذج حيوي - حتى في الوقت الذي كنت قد أنشأت المثال ModelForm، الحقول وليس في تستبعد بالفعل أضيفت كما سمات الكائن الجديد

والطريقة العادية للقيام بذلك سيكون لديك فقط تعريفات فئة متعددة لكل الممكنة استبعاد القائمة. ولكن إذا كنت تريد النموذج نفسه لتكون دينامية، سيكون لديك لإنشاء تعريف فئة على الطاير. شيء من هذا القبيل:

def get_form(exclude_list):
    class MyForm(ModelForm):
        class Meta:
            model = Passenger
            exclude = exclude_list
    return MyForm

form_class = get_form(('field1', 'field2'))
form = form_class()

<القوي> UPDATE : لأنني مجرد النظر هذا المنصب، واعتقدت أن إضافة القليل من طريقة أكثر الاصطلاحية للتعامل مع فئة ديناميكية:

def PassengerForm(exclude_list, *args, **kwargs):
    class MyPassengerForm(ModelForm):
        class Meta:
            model = Passenger
            exclude = exclude_list

        def __init__(self):
            super(MyPassengerForm, self).__init__(*args, **kwargs)

    return MyPassengerForm()

form = PassengerForm(('field1', 'field2'))

نصائح أخرى

وهناك طريقة أخرى:

class PassengerInfoForm(ModelForm):
    def __init__(self, *args, **kwargs):
        exclude_list=kwargs.pop('exclude_list', '')

        super(PassengerInfoForm, self).__init__(*args, **kwargs)

        for field in exclude_list:
            del self.fields[field]

    class Meta:
        model = Passenger

form = PassengerInfoForm(exclude_list=['field1', 'field2'])

ونهج مماثلة، الهدف مختلفة نوعا ما (ModelForm عام لنماذج التعسفي):

from django.contrib.admin.widgets import AdminDateWidget
from django.forms import ModelForm
from django.db import models

def ModelFormFactory(some_model, *args, **kwargs):
    """
    Create a ModelForm for some_model
    """
    widdict = {}
    # set some widgets for special fields
    for field in some_model._meta.local_fields:
        if type(field) is models.DateField:
            widdict[field.name] = AdminDateWidget()

    class MyModelForm(ModelForm): # I use my personal BaseModelForm as parent
        class Meta:
            model = some_model
            widgets = widdict

    return MyModelForm(*args, **kwargs)
scroll top