2012-03-17 13 views
48

मैं WTForms में फ़ील्ड पर प्लेसहोल्डर विशेषता जोड़ना चाहता हूं। मैं यह कैसे कर सकता हूं?पायथन: WTForms जब मैं फ़ील्ड में प्रवेश करता हूं तो क्या मैं प्लेसहोल्डर विशेषता जोड़ सकता हूं?

abc = TextField('abc', validators=[Required(), Length(min=3, max=30)], placeholder="test") 

ऊपर कोड मान्य नहीं है

मैं कैसे मान के साथ एक प्लेसहोल्डर विशेषता जोड़ सकते हैं?

उत्तर

77

WTForms 2.1

अब WTForms 2.1 (दिसंबर 2015) के रूप में आप क्षेत्र निर्माता को render_kw= पैरामीटर का उपयोग करके कीवर्ड प्रतिपादन सेट कर सकते हैं के लिए अपडेट किया गया।

तो क्षेत्र लगेगा जैसे:

abc = StringField('abc', [InputRequired()], render_kw={"placeholder": "test"}) 

नोट करते हुए यह संभव है; यह कोड और प्रस्तुति के बीच की रेखा को पुल करना शुरू कर देता है; तो बुद्धिमानी से इसका इस्तेमाल करें!


(पुराना जवाब है, अभी भी WTForms 2.1 की तुलना में पुराने संस्करणों के लिए सही)

placeholder WTforms 2.0.x और नीचे में अजगर निर्माता में समर्थित नहीं है।

लेकिन, आप अपने टेम्पलेट में आसानी से कर सकते हैं:

abc = TextField('abc', validators=[Required(), Length(min=3, max=30)], description="test") 

एक documenatation में पढ़ सकते हैं के रूप में:: फिर

description – A description for the field, typically used for help text. 

{{ form.abc(placeholder="test") }} 
+2

आप सही हैं, प्लेसहोल्डर शैली होना चाहिए और संरचनात्मक तत्वों में नहीं जोड़ना चाहिए। –

+0

लेकिन अगर मैं एक मैक्रो का उपयोग करता हूं और एक लूप के अंदर बुलाया जाता है जो फॉर्म फ़ील्ड के माध्यम से पुनरावृत्त होता है। मैं मैक्रो के अंदर कैसे जांच सकता हूं कि फ़ील्ड में अतिरिक्त HTML विशेषताएँ हैं? – Marconi

+10

प्लेसहोल्डर लेबल के समान ही है। इसलिए, यह सामग्री और शैली नहीं है। इसे टेम्पलेट में सेट करना सामान्य टेम्पलेट्स को असंभव बनाता है। – Milimetric

7

सही जवाब इस प्रकार है आपके टेम्पलेट में:

{% import 'forms.html' as forms %} 

{% for field in form %} 
    {{ forms.render_field(field) }} 
{% endfor %} 

कहाँ render_field मैक्रो forms.html में परिभाषित किया जाता है:

{% macro render_field(field) -%} 

{% if field.type == 'CSRFTokenField' %} 
    {{ field }} 

    {% if field.errors %} 
     <div class="warning">You have submitted an invalid CSRF token</div> 
    {% endif %} 
{% elif field.type == 'HiddenField' %} 
    {{ field }} 
{# any other special case you may need #} 
{% else %} 
    <div class="form-group"> 
     <label for="{{ field.label.field_id }}" class="col-sm-2 control-label">{{ field.label.text }}</label> 
     <div class="col-sm-10"> 
      {{ field(placeholder=field.description) }} 
      {% if field.errors %} 
       <div class="alert alert-danger" role="alert"> 
       {% for err in field.errors %} 
        <p>{{ err|e }}</p> 
       {% endfor %} 
       </div> 
      {% endif %} 
     </div> 
    </div> 
{% endif %} 

{%- endmacro %} 
1

मेरे समाधान एक कस्टम विजेट का उपयोग है:

from flask.ext.wtf import Form 
from wtforms import StringField, validators 
from wtforms.widgets import Input 


class CustomInput(Input): 
    input_type = None 

    def __init__(self, input_type=None, **kwargs): 
     self.params = kwargs 
     super(CustomInput, self).__init__(input_type=input_type) 

    def __call__(self, field, **kwargs): 
     for param, value in self.params.iteritems(): 
      kwargs.setdefault(param, value) 
     return super(CustomInput, self).__call__(field, **kwargs) 


class CustomTextInput(CustomInput): 
    input_type = 'text' 


class EditProfileForm(Form): 
    first_name = StringField('First name', 
          validators=[validators.DataRequired()], 
          widget=CustomTextInput(placeholder='Enter first name')) 

शायद यह ellegant नहीं है, लेकिन यह बोतल का उपयोग करने की अनुमति देता है -बूटस्ट्रैप और फॉर्म फॉर्म में अपने फॉर्म को परिभाषित करें, टेम्पलेट में नहीं

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

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