Django: How to check if field widget is checkbox in the template?

前端 未结 3 1873
一向
一向 2021-01-04 20:09

I\'ve created a custom template for rendering form fields:


    
        <         


        
相关标签:
3条回答
  • 2021-01-04 20:09

    Use a custom template filter!

    In yourapp/templatetags/my_custom_tags.py:

    from django import template
    from django.forms import CheckboxInput
    
    register = template.Library()
    
    @register.filter(name='is_checkbox')
    def is_checkbox(field):
      return field.field.widget.__class__.__name__ == CheckboxInput().__class__.__name__
    

    In your template:

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

    Side note on implementation: when I don't instantiate a CheckboxInput, the class name is MediaDefiningClass.

    >>> form django.forms import CheckboxInput
    KeyboardInterrupt
    >>> CheckboxInput.__class__.__name__
    'MediaDefiningClass'
    
    0 讨论(0)
  • 2021-01-04 20:26

    {{ field.field.widget.input_type }} will get you this info for a lot of widgets, but not all. I'm not sure if it'll work for the default checkbox widget or not. Worth a shot.

    0 讨论(0)
  • 2021-01-04 20:32

    It is kind of late to answer, but I implemented something similar to what is done in Django's admin.

    First, I added a new attribute is_checkbox to the Field class:

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

    Then, I can easily detect a CheckboxInput widget in the template. Here is an example to render checkboxes to the left and other widgets to the right:

    {% if field.field.is_checkbox %}
        {{ field }} {{ field.label_tag }}
    {% else %}
        {{ field.label }} {{ field }}
    {% endif %}
    
    0 讨论(0)
提交回复
热议问题