2010-10-13 29 views
6

tôi đã tạo ra một mẫu tùy chỉnh để hiển thị biểu mẫu form:Django: Làm thế nào để kiểm tra xem widget trường là hộp kiểm trong mẫu?

<tr class="{{field.field.widget.attrs.class}}"> 
    <th class="label"> 
     <label for="{{field.auto_id}}"> 
      {{field.label}} 
      {% if not field.field.required %}<span class="optional">(optional)</span>{% endif %} 
     </label> 
    </th> 
    <td class="field"> 
     {{field}} 
     {% if field.errors %}<label class="error" for="{{field.auto_id}}">{{field.errors.0}}</label>{% endif %} 
     {% if field.help_text %}<small class="help-text">{{field.help_text}}</small>{% endif %} 
    </td> 
</tr> 

Nhưng tôi muốn kiểm tra xem widget là một ô trống, và nếu như vậy, làm cho nó khác đi. Làm thế nào tôi có thể làm điều đó trong mẫu?

+0

Xin chào - có lý do cụ thể khiến bạn cần thực hiện trong mẫu, thay vì đặt tiện ích con tùy chỉnh trong lớp biểu mẫu ? –

+1

@stevejalim: Tôi có thể tạo tiện ích con tùy chỉnh nhưng không giải quyết được sự cố. Tôi muốn đặt colspan = 2 và có nhãn ở bên phải. Đây là vấn đề với cách sắp xếp hàng của bảng, chứ không phải cách hiển thị tiện ích con. – mpen

+0

. Một (hacky) cách để làm điều đó là để vượt qua trong một danh sách các lĩnh vực được gọi là hộp kiểm và mỗi khi bạn render trường, kiểm tra xem tên của nó là trong danh sách đó, và nếu như vậy, đặt colspan của bạn ở đó. Icky, mặc dù; o) –

Trả lời

12

Sử dụng một custom template filter!

Trong yourapp/templatetags/my_custom_tags.py:

from django import template 
from django.forms import CheckboxInput 

@register.filter(name='is_checkbox') 
def is_checkbox(field): 
    return field.field.widget.__class__.__name__ == CheckboxInput().__class__.__name__ 

Trong mẫu của bạn: Side

{% load my_custom_tags %} 

{% if field|is_checkbox %} 
    do something 
{% endif %} 

lưu ý về việc thực hiện: khi tôi không nhanh chóng một CheckboxInput, tên lớp là MediaDefiningClass.

>>> form django.forms import CheckboxInput 
KeyboardInterrupt 
>>> CheckboxInput.__class__.__name__ 
'MediaDefiningClass' 
+4

Và hôm nay có một ứng dụng tiện ích Django đặc biệt có trình kiểm tra tương tự và các công cụ khác: https://pypi.python.org/pypi/django-form-utils#is-checkbox – rudyryk

+0

Tôi muốn nói rằng nó sạch hơn để sử dụng một cái gì đó như điều này: 'return isinstance (field.field.widget, CheckboxInput)'. –

6

{{ field.field.widget.input_type }} sẽ cung cấp cho bạn thông tin này cho nhiều tiện ích, nhưng không phải tất cả. Tôi không chắc liệu nó có hoạt động với tiện ích hộp kiểm mặc định hay không. Đáng để thử.

+1

Đừng nghĩ rằng CheckboxInput có thuộc tính này ... tuy nhiên nó xuất hiện để có một thuộc tính 'check_test' ... Tôi không biết nếu nó là duy nhất cho đầu vào hộp kiểm ... nhưng nó đang làm việc cho bây giờ. .. bit của một hack mặc dù. – mpen

6

Đó là loại câu trả lời trễ, nhưng tôi đã triển khai một cái gì đó tương tự như những gì được thực hiện trong quản trị viên của Django.

Đầu tiên, tôi đã thêm một thuộc tính mới is_checkbox đến lớp Dòng:

# forms.py 
from django import forms 
from django.forms.fields import Field 
setattr(Field, 'is_checkbox', lambda self: isinstance(self.widget, forms.CheckboxInput)) 

Sau đó, tôi có thể dễ dàng phát hiện một widget CheckboxInput trong mẫu. Dưới đây là ví dụ để hiển thị hộp kiểm ở bên trái và các tiện ích con khác ở bên phải:

{% if field.field.is_checkbox %} 
    {{ field }} {{ field.label_tag }} 
{% else %} 
    {{ field.label }} {{ field }} 
{% endif %} 
Các vấn đề liên quan