12

मैं उपयोगकर्ताओं और चेकबॉक्सों की एक सूची के साथ एक पृष्ठ बनाना चाहता हूं जो उपयोगकर्ता को चुना गया है, जो सिग्नल उपयोगकर्ताओं को कुछ क्रिया लागू करेगा। मेरे टेम्पलेट मेंटेम्पलेट में django फॉर्म फ़ील्ड को प्रस्तुत करने के लिए कैसे करें

#in forms.py 
class UserSelectionForm(forms.Form): 
    """form for selecting users""" 
    def __init__(self, userlist, *args, **kwargs): 
     self.custom_fields = userlist 
     super(forms.Form, self).__init__(*args, **kwargs) 
     for f in userlist: 
      self.fields[str(f.id)] = forms.BooleanField(initial=False)  

    def get_selected(self): 
     """returns selected users""" 
     return filter(lambda u: self.fields[str(u.id)], self.custom_fields) 

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

<form action="" method="post"> 
{% csrf_token %} 
<table class="listtable"> 
    <tr> 
    <th>Username</th> 
    <th>Select</th> 
    </tr> 
{% for u in userlist %} 
    <tr> 
    <td>{{u.username}}</td> 
    <td>{{select_form|user_select_field:u.id}}</td> 
    </tr> 
{% endfor %} 
</table> 
<p><input type="submit" value="make actions" /></p> 

बहरहाल, यह करने के लिए उन विगेट्स बाध्य नहीं करता है:

#in templatetags/user_list_tags.py 
from django import template 
register = template.Library() 

#this is django template tag for user selection form 
@register.filter 
def user_select_field(form, userid): 
    """ 
    returns UserSelectionForm field for a user with userid 
    """ 
    key = std(userid) 
    if key not in form.fields.keys(): 
     print 'Key %s not found in dict' % key 
     return None 
     return form.fields[key].widget.render(form, key) 

अंत में, यहाँ टेम्पलेट कोड है फॉर्म और इस प्रकार, फॉर्म जमा करने के बाद, सत्यापन विफल रहता है। त्रुटि संदेश कहता है कि सभी कस्टम फ़ील्ड आवश्यक हैं। तो यहाँ मेरे सवालों हैं:

  1. सही तरीके से अलग प्रपत्र फ़ील्ड्स रेंडर करने के लिए क्या है?

  2. चेकबॉक्स के साथ ऐसा फॉर्म बनाने का सही तरीका क्या है? (मैं शायद मतलब मेरी विधि बेवकूफ है और वहाँ प्राप्त करने मैं क्या चाहते हैं की एक बहुत आसान तरीका है।

+0

शायद आपको इसे थोड़ा जावास्क्रिप्ट के साथ करने का प्रयास करना चाहिए। – unni

+0

मैं इस चरण में अपने प्रोजेक्ट में जावास्क्रिप्ट का उपयोग नहीं करना चाहता था। हालांकि, मुझे वास्तव में क्या करना चाहिए? या मुझे क्या गूगल चाहिए? आप जानते हैं कि मैं एक विशाल जावास्क्रिप्ट समर्थक नहीं हूं =) –

उत्तर

8

ठीक है तो मुझे लगता है मुझे अलग-अलग फॉर्म फ़ील्ड सही ढंग से प्रस्तुत करने का एक तरीका मिला है। मैंने इसे django स्रोतों को देखा। Django.forms.forms.BaseForm कक्षा में _html_output विधि है जो Django.forms.forms.BoundField का एक उदाहरण बनाता है और फिर HTML आउटपुट में unicode(boundField) जोड़ता है। मैं ठीक उसी काम किया है और यह पूरी तरह से काम किया:

#in templatetags/user_list_tags.py 
from django import template 
from django import forms 
register = template.Library() 

#this is djangp template tag for user selection form 
@register.filter 
def user_select_field(form, userid): 
    """ 
    returns UserSelectionForm field for a user with userid 
    """ 
    key = str(userid) 
    if key not in form.fields.keys(): 
     print 'Key %s not found in dict' % key 
     return None 
    #here i use BoundField: 
    boundField = forms.forms.BoundField(form, form.fields[key], key) 
    return unicode(boundField) 

वह उसी एचटीएमएल के रूप में {{form.as_p}}, इसलिए पोस्ट अनुरोध बिल्कुल वैसा ही दिखेगा और फार्म सही ढंग से कार्रवाई की जाएगी उत्पन्न। ,

#in UserSelectionForm definition: 
... 
#__init__ 
for f in userlist: 
    self.fields[str(f.id)] = forms.BooleanField(initial=False, required=False) 
#get_selected  
return filter(lambda u: self.cleaned_data[str(u.id)], 
    self.custom_fields) 

अब के रूप में मैं योजना बनाई काम करने के लिए लगता है कि किसी भी जावास्क्रिप्ट के बिना:

मैं अपने प्रपत्र वर्ग में कुछ गलतियों को तय की।

+3

[स्रोत कोड] पढ़ना (https://github.com/django/django/blob/master/django/forms/forms.py#L108) मैंने पाया कि बाउंडफ़ील्ड का उपयोग करने के बजाय, 'फॉर्म [कुंजी' करने के लिए क्लीनर है ] 'और आप एक ही बाउंडफिल्ड प्राप्त करते हैं। –

12

आप टेम्पलेट अभी तक बहुत जटिल बना रहे हैं। प्रत्येक क्षेत्र के लिए एक लेबल जोड़ें जब आप में इसे बनाने के प्रपत्र के __init__ विधि।

for f in userlist: 
    self.fields[str(f.id)] = forms.BooleanField(label=f.username, initial=False) 

तो बस के रूप में क्षेत्रों पर पाश और अब userlist के बारे में चिंता मत करो।

+0

दुर्भाग्य से, मैं यह नहीं कर सकता। उदाहरण के लिए मैंने अपने कोड को थोड़ा सा सरल बना दिया। इस चेकबॉक्स के साथ मेरी संस्करण तालिका पंक्ति में दो से अधिक कॉलम हैं, और चेकबॉक्स के अलावा एक और विजेट है ("चयन विधि", जहां मैं सभी उपयोगकर्ताओं का चयन करने के लिए मौसम चुन सकता हूं, या केवल चेकबॉक्स द्वारा चयनित)। शायद मुझे उन सभी को अलग-अलग रूपों में विभाजित करने का प्रयास करना चाहिए?यह 'get_selected' विधि' के incapsulation को खो देगा, लेकिन कार्य को आसानी से कर सकते हैं। –

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

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