2012-07-03 29 views
14

có cách nào tôi có thể gửi một lớp (css) của biểu mẫu từ trăn không? Ví dụ:Wtforms, thêm một lớp vào biểu mẫu động

class Company(Form): 
    companyName = TextField('Company Name', [validators.Length(min=3, max = 60)]) 

này ám một trường văn bản đơn giản, nhưng tôi muốn rằng trường văn bản để có lớp css của .companyName, là có thể trực tiếp từ python?

Tôi biết rằng tôi có thể đặt id="companyName" trực tiếp từ python, nhưng không phải lớp học.

Trợ giúp.

Cập nhật: tôi đã cố gắng class_="companyName" và nó đã không làm việc, tôi đã nhận:

__init__() got an unexpected keyword argument '_class' 

Trả lời

24

WTForms không cho phép bạn thiết lập tùy chọn hiển thị (ví dụ như tên lớp) trong lĩnh vực khởi. Tuy nhiên, có một số cách để làm được việc này:

  1. Nếu tất cả các lĩnh vực của bạn nên bao gồm một tên lớp cũng như một ID sau đó chỉ cần vượt qua trong từng lĩnh vực của short_name đến nó khi bạn làm cho nó:

    <dl> 
    {% for field in form %} 
    <dt>{{field.label}}</dt> 
    <dd>{{field(class_=field.short_name)}}</dd> 
    {% endfor %} 
    </dl> 
    
  2. Tạo một mixin custom widget cung cấp tên lớp:

    from wtforms.fields import StringField 
    from wtforms.widgets import TextInput 
    
    class ClassedWidgetMixin(object): 
        """Adds the field's name as a class 
        when subclassed with any WTForms Field type. 
    
        Has not been tested - may not work.""" 
        def __init__(self, *args, **kwargs): 
         super(ClassedWidgetMixin, self).__init__(*args, **kwargs) 
    
        def __call__(self, field, **kwargs): 
         c = kwargs.pop('class', '') or kwargs.pop('class_', '') 
         kwargs['class'] = u'%s %s' % (field.short_name, c) 
         return super(ClassedWidgetMixin, self).__call__(field, **kwargs) 
    
    # An example 
    class ClassedTextInput(ClassedWidgetMixin, TextInput): 
        pass 
    
    class Company(Form): 
        company_name = StringField('Company Name', widget=ClassedTextInput) 
    
+0

Thank bạn. Rất hữu ích! – verrochio

44

Hoặc bạn có thể thêm các lớp trong mẫu của bạn như thế này cho jinja2:

{{ form.name(size=20, class_='input-small') }} 
+0

Bạn cứu tôi. Trân trọng cảm ơn bạn !! –

+0

Lưu tôi là tốt :) Đây là một giải pháp tuyệt vời, không chắc chắn lý do tại sao một ví dụ dọc theo những dòng này không phải là một nơi nào đó trong tài liệu WTForm – sofly

+2

Tôi bỏ phiếu lên mười lần nếu có thể, đây là một giải pháp tốt hơn nhiều. Bây giờ tôi có thể ngồi lại và xem đá WTForms ~~~ – benjaminz

0

Trong mẫu của bạn, hãy thử nó

{{ form.companyName(**{'class': 'companyName'}) }} 
+2

Trong các hàm Python, bạn không thể sử dụng "lớp" làm đối số được đặt tên vì nó là từ khóa ngôn ngữ. Ví dụ, 'myfunc (class = 'xyz')' kết quả trong một cú pháp SyntaxError. Sử dụng 'myfunc (** {'class': 'xyz'})' như được hiển thị ở trên sẽ giải quyết vấn đề đó. Cảm ơn ví dụ của bạn! – David

5

Sử dụng render_kw nếu sử dụng WTForms >= 2.1:

submit = SubmitField(u'Block Submit Buttom', render_kw={"class": "btn btn-primary btn-block"})

+0

Nó làm việc cho tôi nhiều ngày tuổi, nhưng nó chỉ thất bại bây giờ. Tôi không nhớ những gì tôi đã làm sau đó, nhưng gần như giống như câu trả lời của bạn. Sau Ctrl + F5, nút gửi cũng hiển thị lớp ** btn btn-default **: - (... Bất kỳ lỗi nào có thể? 'WTForms == 2.1' và' Flask-WTF == 0.14.2' –

Các vấn đề liên quan