2010-03-05 14 views
5

का उपयोग करता है, मैं एक Django फ़ील्ड कैसे बना सकता हूं जो इनपुट फ़ील्ड इनपुट की एक जोड़ी के रूप में स्वयं को प्रस्तुत करता है?एक कस्टम Django फॉर्म फ़ील्ड बनाना जो दो <input> s

तर्क: मैं एक नया कस्टम फ़ील्ड लिखने की कोशिश कर रहा हूं। मैं इसे कैप्चा जैसी सेवा के लिए उपयोग करूंगा। यह सेवा एक प्रश्न - का अनुरोध करके काम करती है और फिर एक और टोकन प्राप्त करती है। टोकन के साथ उत्तर भेजकर सत्यापन होता है। मैं एक फॉर्म फ़ील्ड लिखना चाहता हूं जो इस तर्क को समाहित करता है। तत्वों (IMO) की तरह प्रस्तुत करना चाहिए

<input type="hidden" name="_token" value="1234567890" /> 
<input type="text" name="answer" /> 

और पर प्रस्तुत मैं _token और answer का मूल्य की जरूरत है जवाब मान्य करने के लिए।

उत्तर

2

SelectDateWidget पर एक नज़र डालें। यह एक तारीख के इनपुट को तीन चयन बक्से में विभाजित करता है।

और डॉक स्ट्रिंग का कहना है:

यह भी एक विजेट एक से अधिक HTML तत्व है की एक उदाहरण के रूप में कार्य करता है और इसलिए value_from_datadict लागू करता है।

9

मुझे लगता है कि आप MultiWidget की तलाश में हैं, तो आप इसे आसानी से 2 नियमित विजेट दे सकते हैं और यह संयोजन प्रस्तुत करेगा।

4

यहाँ आप एक तैयार उदाहरण है (मेरे ब्लॉग से लिया गया):

class ComplexMultiWidget(forms.MultiWidget): 
    def __init__(self, attrs=None): 
     widgets = (
      forms.TextInput(), 
      forms.SelectMultiple(choices=(('J', 'John'), 
              ('P', 'Paul'), 
              ('G', 'George'), 
              ('R', 'Ringo'))), 
      forms.SplitDateTimeWidget(), 
     ) 
     super(ComplexMultiWidget, self).__init__(widgets, attrs) 

    def decompress(self, value): 
     if value: 
      data = value.split(',') 
      return [data[0], data[1], 
        datetime.datetime(*time.strptime(data[2], 
        "%Y-%m-%d %H:%M:%S")[0:6])] 
     return [None, None, None] 
    def format_output(self, rendered_widgets): 
     return u'\n'.join(rendered_widgets) 


class ComplexField(forms.MultiValueField): 
    def __init__(self, required=True, widget=None, label=None, initial=None): 
     fields = (
      forms.CharField(), 
      forms.MultipleChoiceField(choices=(('J', 'John'), 
               ('P', 'Paul'), 
               ('G', 'George'), 
               ('R', 'Ringo'))), 
      forms.SplitDateTimeField() 
     ) 
     super(ComplexField, self).__init__(fields, required, 
              widget, label, initial) 

    def compress(self, data_list): 
     if data_list: 
      return '%s,%s,%s' % (data_list[0],''.join(data_list[1]), 
           data_list[2]) 
     return None 

उदाहरण का उपयोग कैसे करें:

>>> f = ComplexField(widget=ComplexMultiWidget()) 
>>> f.clean(['some text', ['J','P'], ['2007-04-25','6:24:00']]) 
u'some text,JP,2007-04-25 06:24:00' 
>>> f.clean(['some text',['X'], ['2007-04-25','6:24:00']]) 
Traceback (most recent call last): 
... 
ValidationError: [u'Select a valid choice. X is not one of the available choices.'] 

>>> f.clean(['some text',['JP']]) 
Traceback (most recent call last): 

>>> class ComplexFieldForm(Form): 
      field1 = ComplexField(widget=ComplexMultiWidget()) 

>>> f = ComplexFieldForm({'field1_0':'some text','field1_1':['J','P'], 'field1_2_0':'2007-04-25', 'field1_2_1':'06:24:00'}) 
>>> print f 
<tr><th><label for="id_field1_0">Field1:</label></th><td><input type="text" name="field1_0" value="some text" id="id_field1_0" /> 
<select multiple="multiple" name="field1_1" id="id_field1_1"> 
<option value="J" selected="selected">John</option> 
<option value="P" selected="selected">Paul</option> 
<option value="G">George</option> 
<option value="R">Ringo</option> 
</select> 
<input type="text" name="field1_2_0" value="2007-04-25" id="id_field1_2_0" /><input type="text" name="field1_2_1" value="06:24:00" id="id_field1_2_1" /></td></tr> 

>>> f.cleaned_data 
{'field1': u'some text,JP,2007-04-25 06:24:00'} 
+0

क्षेत्रों में से एक एक 'CharField' कि HiddenInput' साथ गाया जाता है '। कोई विचार यह शुरुआत में कैसे बनाया जा सकता है (शायद कन्स्ट्रक्टर में)? –

संबंधित मुद्दे