2008-11-17 9 views
22

अद्यतन करें मैं उम्मीद करता हूं कि मेरे दृश्य से मॉडलफॉर्म की इनलाइन मेटा क्लास को गतिशील रूप से अपडेट करने की उम्मीद है। हालांकि यह कोड मेटा क्लास में बहिष्कृत सूची को अपडेट करने लगता है, as_p(), as_ul() आदि का आउटपुट अद्यतन मेटा बहिष्कार को प्रतिबिंबित नहीं करता है।गतिशील रूप से मॉडलफॉर्म के मेटा क्लास

मुझे लगता है कि जब HTMLForm बनाया गया है तो HTML उत्पन्न होता है जब 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 = [] 

उत्तर

55

मेटा वर्ग को गतिशील रूप परिभाषा के निर्माण के लिए प्रयोग किया जाता है - तो समय से आप 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() 

अद्यतन: मैं बस इस पोस्ट पर दोबारा गौर किया और मैं एक गतिशील वर्ग को संभालने के लिए थोड़ा और मुहावरेदार तरह से पोस्ट करता हूँ सोचा:

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')) 
+2

+1: गतिशील रूप वर्ग निर्माण। बीमार। –

+0

उत्कृष्ट। धन्यवाद! – ashchristopher

+0

महान उदाहरण धन्यवाद। मॉडल सेट गतिशील रूप से भी संभव है? फॉर्म = getModelForm (यात्री, ('फ़ील्ड 1', 'फ़ील्ड 2')) – jujule

12

एक और तरीका है:

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']) 
+0

थोड़ा अधिक शामिल नहीं है, लेकिन निश्चित रूप से –

+8

काम करेगा, आपको शायद {} .pop() का उपयोग करना चाहिए इसे हटाने के बाद इसे हटा दें। बहिष्कार_सूची = kwargs.pop ('extrae_list') कोड की एक पंक्ति सहेजता है। * shrug * –

+0

@JustinAbrahms के रूप में कहा गया है कि मुझे आशा है कि आप ** kwargs.pop ('extrae_list', default_value) ** का उपयोग कर सकते हैं ** कुछ चीज़ 'exte_list = kwargs.pop (' extrae_list ',' '' ' – suhailvs

3

इसी तरह के दृष्टिकोण, कुछ अलग लक्ष्य (मनमानी मॉडल के लिए जेनेरिक मॉडलफॉर्म):

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) 
2

उपयोग modelform_factory (doc):

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 
संबंधित मुद्दे