2011-02-09 28 views
5

पर रूपों के लिए जिम्मेदार बताते हैं मैं निम्नलिखित टेम्पलेट मान लीजिए:Django कैसे जोड़ने के लिए एचटीएमएल टेम्पलेट्स

<div id="openid_input_area"> 
{{ form.openid_identifier }} 
    <input name="bsignin" type="submit" value="{% trans "Sign in" %}"> 
</div> 

मैं कैसे form.openid_identifier करने के लिए एक सीएसएस वर्ग जोड़ सकते हैं?

मैं एसओसी को सिद्धांतों का पालन कर रहा हूँ और मैं डिजाइनरों टेम्पलेट्स में सुधार की उम्मीद के रूप में मैं नहीं प्रपत्र मॉडल पर लेकिन टेम्पलेट पर ही ऐसा करना चाहते हैं।

मैं डॉक्स पर इस पर कुछ भी नहीं मिला। क्या टेम्पलेट पर ऐसा करने का कोई तरीका है?

उत्तर

16

मैं मेरी समस्या के लिए एक सरल उपाय कोड करने के लिए प्रबंधित किया है

from django import template 

register = template.Library() 

def htmlattributes(value, arg): 
    attrs = value.field.widget.attrs 


    data = arg.replace(' ', '') 

    kvs = data.split(',') 

    for string in kvs: 
     kv = string.split(':') 
     attrs[kv[0]] = kv[1] 

    rendered = str(value) 

    return rendered 

register.filter('htmlattributes', htmlattributes) 

और मैं पर क्या करना है सब टेम्पलेट है:

{{ form.openid_identifier|htmlattributes:"class : something, id: openid_identifier" }} 
2

मैं सादे Django में किसी अन्य तरीके से की पता नहीं है। form.field या form.as_p तरह शॉर्टकट वास्तव में आपके लिए प्रारंभ करने, लेकिन अंत में एक सादे HTML पर वापस गिर सकती है। इस तरह मैं इसे देखता हूं। यह नहीं कहना है कि प्रतिपादन के बारे में अधिक नियंत्रण की आवश्यकता नहीं है। मुझे Django मेलिंग सूची पर this discussion about form rendering पढ़ने याद है।

सिमोन विललिसन है/एक पुस्तकालय पर काम कर रहा था डिजाइनरों अधिक नियंत्रण प्रदान करने के लिए, आप अपने स्रोत on github पा सकते हैं। यह थोड़ा बड़ा है, इसलिए यह अब भी काम नहीं कर सकता है। लेकिन आपके प्रश्न के संबंध में, यह उदाहरण ऐसा लगता है कि यह आपके लिए उपयोग किया जा सकता है:

{% field form.name class="myclass" %} 
<!-- renders as --> 
<input type="text" name="name" id="id_name" class="myclass"> 

असल में यह कार्यक्षमता हासिल करना आसान होना चाहिए। आपको एक टेम्पलेट टैग की आवश्यकता है जो एक फॉर्म फ़ील्ड स्वीकार करता है, विजेट गुणों को अपडेट करता है (जिन्हें आप पहले से फॉर्म पर सेट कर सकते हैं) और फ़ील्ड प्रस्तुत करते हैं।

एक फॉर्म पर इटरेटिंग BoundField के उदाहरण पैदा करता है, जो स्वयं को __unicode__ विधि के साथ प्रस्तुत करता है। आपको विजेट को प्रस्तुत करने के लिए सभी कीवर्ड तर्कों को पारित करने की आवश्यकता होगी। इस विचार का एक मसौदा:

मैं एक custom template tag लिखा है::

@register.simple_tag 
def field(boundfield, **kwargs): 
    if self.field.show_hidden_initial: 
     return self.as_widget(attrs=kwargs) + self.as_hidden(only_initial=True) 
    return self.as_widget(attrs=kwargs) 
संबंधित मुद्दे