تحديث حيوي الطبقة الفوقية ModelForm ل
-
08-07-2019 - |
سؤال
وأنا على أمل لتحديث الطبقة الفوقية المضمنة في 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)
استخدم modelform_factory
( ثيقة أ >):
from django.forms.models import modelform_factory
from testprogram.online_bookings.models import Passenger
exclude = ('field1', 'field2')
CustomForm = modelform_factory(model=Passenger, exclude=exclude) # generates ModelForm dynamically
custom_form = CustomForm(data=request.POST, ...) # form instance