2009-12-13 4 views
16

में प्रत्येक फ़ॉर्म के लिए अलग-अलग प्रारंभिक डेटा प्रत्येक पंक्ति के लिए अलग-अलग डेटा के साथ एक फ़ॉर्मेट को पूर्ववत करना संभव है? मैं पिछली दृश्य से छुपा क्षेत्रों में कुछ जानकारी डालना चाहता हूं।Django formet

दस्तावेज़ों के मुताबिक आप केवल बोर्ड में प्रारंभिक सेट कर सकते हैं।

उत्तर

2

मैं इस समस्या थी और मैं एक नया विजेट बनाया:

from django.forms.widgets import Select 
from django.utils.safestring import mark_safe 
class PrepolutatedSelect(Select): 
    def render(self, name, value, attrs=None, choices=()): 
     if value is None: value = '' 
     if value == '': 
      value = int(name.split('-')[1])+1 
     final_attrs = self.build_attrs(attrs, name=name) 
     output = [u'<select%s>' % flatatt(final_attrs)] 
     options = self.render_options(choices, [value]) 
     if options: 
      output.append(options) 
     output.append('</select>') 
     return mark_safe(u'\n'.join(output)) 

हो सकता है कि यह आपके लिए भी काम करेगा।

+0

मुझे ओपी के लिए एक ही समस्या है। मैं कई रूपों के साथ एक फॉर्मेट बनाने की कोशिश कर रहा हूं, प्रत्येक फॉर्म के साथ यह एक चुनिंदा तत्व (यानी "विकल्प") के विकल्पों का अपना अनूठा सेट है। मैं बिल्कुल नहीं देख सकता कि यह समाधान कैसे मदद करेगा। क्या मैं कुछ भूल रहा हूँ? – ACPrice

10

पैरामीटर पास करने में सक्षम होने के लिए आपको this post में वर्णित तकनीक का उपयोग करने की आवश्यकता है। उत्कृष्ट लेखक के लिए उस लेखक को क्रेडिट करें। आप कई हिस्सों में इस लक्ष्य को हासिल:

एक जागरूक यह जुड़ा हुआ सवाल से

उदाहरण अतिरिक्त पैरामीटर लेने के लिए जा रहा है के रूप में:

def __init__(self, *args, **kwargs): 
    someeobject = kwargs.pop('someobject') 
    super(ServiceForm, self).__init__(*args, **kwargs) 
    self.fields["somefield"].queryset = ServiceOption.objects.filter(
                  somem2mrel=someobject) 

या आप

के साथ बाद कोड की जगह ले सकता
self.fields["somefield"].initial = someobject 

सीधे, और यह काम करता है।

एक curried रूप initialisation सेटअप:

formset = formset_factory(Someform, extra=3) 
formset.form = staticmethod(curry(someform, somem2mrel=someobject)) 

कि आप कस्टम प्रपत्र पैरामीटर प्रदान करने के लिए हो जाता है। अब तुम क्या जरूरत है:

एक जनरेटर अपने विभिन्न प्रारंभिक मापदंडों

मैं इस का उपयोग कर रहा प्राप्त करने के लिए: अब

def ItemGenerator(Item): 
    i = 0 
    while i < len(Item): 
     yield Item[i] 
     i += 1 

, मैं यह कर सकता:

iterdefs = ItemGenerator(ListofItems) # pass the different parameters 
             # as an object here 
formset.form = staticmethod(curry(someform, somem2mrel=iterdefs.next())) 

अरे प्रतिष्ठा। form विधि के प्रत्येक मूल्यांकन का पुनरावृत्त पैरामीटर में गुजरने वाले हिस्सों में मूल्यांकन किया जा रहा है। हम जो चाहते हैं उस पर हम पुन: प्रयास कर सकते हैं, इसलिए मैं उस तथ्य का उपयोग वस्तुओं के एक सेट पर फिर से करने के लिए कर रहा हूं और प्रत्येक के मान को एक अलग प्रारंभिक पैरामीटर के रूप में पास कर सकता हूं।

+0

हे! मुझे लगता है कि आपका उत्तर इस समस्या में हल की गई समस्या को हल कर सकता है http://stackoverflow.com/questions/6123278/same-form-different-variables-how-to-implement। लेकिन मैं वास्तव में वास्तव में नहीं समझता कि – pavid

+1

क्या हो रहा है मैंने इस दृष्टिकोण का उपयोग करने की कोशिश की लेकिन प्रत्येक कॉल पर पुनरावर्तक को पुनरावृत्त नहीं किया जा सकता। मेरा कोड: 'सजावटफाइलफॉर्मसेट.फॉर्म = staticmethod (करी (सजावटफाइलफॉर्म, filetype = counter.next())) 'फ़ॉर्म बनाता है जहां फ़ाइल टाइप विशेषता प्रत्येक बार 1 होती है। काउंटर 'itertools.count (1) ' –

+0

का एक उदाहरण है किसी को भी पहले से ही समाधान मिला है? जनरेटर भी मेरे लिए काम नहीं कर रहा है (बिल्कुल भी पुनरावृत्ति नहीं करता है)। – wgx731

2

एंटनी वेनार्ड के जवाब पर बिल्डिंग, मुझे यकीन नहीं है कि वह अजगर/डीजेंगो का कौन सा संस्करण उपयोग कर रहा है लेकिन मैं जनरेटर को करी विधि में काम करने के लिए नहीं मिला। मैं वर्तमान में Python2.7.3 और django1.5.1 पर हूँ। एक कस्टम जनरेटर का उपयोग करने के बजाय, मैंने iter() का उपयोग करके इटेटरेटर बनाने और इसे पुनरावृत्ति विधि में हीरेटर को पार करने और next() पर Form__init__() पर कॉल करने के लिए चीजों की सूची पर समाप्त किया।यहाँ मेरी समाधान है:

# Build the Formset: 
my_iterator = iter(my_list_of_things) # Each list item will correspond to a form. 
Formset = formset_factory(MyForm, extra=len(my_list_of_things)) 
Formset.form = staticmethod(curry(MyForm, item_iterator=my_iterator)) 

और रूप में:

# forms.py 
class MyForm(forms.Form): 
    def __init__(self, *args, **kwargs): 
     # Calling next() on the iterator/generator here: 
     list_item = kwargs.pop('item_iterator').next() 

     # Now you can assign whatever you passed in to an attribute 
     # on one of the form elements. 
     self.fields['my_field'].initial = list_item 

कुछ कुंजी बातें मैंने पाया थे कि आप या तो formset_factory में एक 'अतिरिक्त' मान निर्दिष्ट या पर initial kwarg उपयोग करने की आवश्यकता फ़ॉर्मेट को उस सूची को निर्दिष्ट करने के लिए जो आपके द्वारा इटरेटर को पास की गई सूची से मेल खाता है (उपरोक्त उदाहरण में मैं my_list_of_things सूची के len() को 'अतिरिक्त' kwarg से formet_factory तक पास करता हूं)। वास्तव में फॉर्मेट में कई रूपों को बनाना आवश्यक है।

33

यदि आपने मेरे जैसा ही गलती की है, तो आपने दस्तावेज़ को थोड़ा गलत तरीके से गलत कर दिया है।

जब मैं पहली बार इस उदाहरण देखा ...

formset = ArticleFormSet(initial=[ 
{'title': 'Django is now open source', 
    'pub_date': datetime.date.today(),} 
]) 

मैं मान लिया है कि प्रत्येक प्रपत्र एक शब्दकोश के आधार पर प्रारंभिक डेटा के एक ही सेट दिया जाता है।

हालांकि, यदि आप ध्यान से देखते हैं तो आप देखेंगे कि फ़ॉर्मेट वास्तव में शब्दकोशों की एक सूची पारित किया जा रहा है।

किसी फ़ॉर्मेट में प्रत्येक फॉर्म के लिए अलग-अलग प्रारंभिक मान सेट करने के लिए, आपको केवल अलग-अलग डेटा वाले शब्दकोशों की एक सूची पास करने की आवश्यकता है।

Formset = formset_factory(SomeForm, extra=len(some_objects) 
some_formset = FormSet(initial=[{'id': 'x.id'} for x in some_objects]) 
+2

यह ऐसा करने का सबसे आसान तरीका प्रतीत होता है, और डिफ़ॉल्ट Django इसे करने का तरीका है, और ओपी के बहुत गलत धारणा को पिनपॉइंट करता है। शीर्ष जवाब होना चाहिए। – ACPrice

+1

ध्यान दें कि यह 'ArticleFormSet' को एक [अनबाउंड फॉर्म] (https://docs.djangoproject.com/en/1.10/topics/forms/#bound-and-unbound-form-instances) बना देगा, क्योंकि प्रारंभिक मान ओवरराइट होंगे अनुच्छेद क्वेरीसेट से मूल्य लौटाए गए। –