2010-10-13 13 views
6

Ich habe für das Rendering Formularfelder ein eigenes Template erstellt:Django: Wie überprüft man, ob das Feld Widget in der Vorlage aktiviert ist?

<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> 

Aber ich möchte überprüfen, ob das Widget eine Checkbox ist, und wenn ja, es anders machen. Wie kann ich das in der Vorlage tun?

+0

Hallo - Gibt es einen bestimmten Grund, warum Sie müssen es in der Vorlage zu tun, anstatt ein eigenes Widget in Form Klasse Einstellung ? –

+1

@stevejalim: Ich kann ein benutzerdefiniertes Widget erstellen, aber es löst das Problem nicht. Ich möchte colspan = 2 setzen und das Label auf der rechten Seite haben. Dies ist ein Problem mit der Anordnung der Tabellenzeile und nicht mit der Darstellung des Widgets. – mpen

+0

Gotcha. Ein (hacky) Weg, dies zu tun ist, eine Liste von Feldern zu übergeben, von denen bekannt ist, dass sie Checkboxen sind, und jedes Mal, wenn Sie das Feld rendern, überprüfen Sie, ob der Name in dieser Liste ist. Icky, obwohl; o) –

Antwort

12

Verwenden Sie ein custom template filter!

In 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__ 

in Ihrer Vorlage:

{% load my_custom_tags %} 

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

Exkurs über die Umsetzung: wenn ich instanziiert keine CheckboxInput, der Klassenname ist MediaDefiningClass.

+4

Und heute gibt es eine spezielle Django-Dienstprogramm-Anwendung, die ähnliche Checker und andere Sachen hat: https://pypi.python.org/pypi/django-form-utils#is-checkbox – rudyryk

+0

Ich würde sagen, dass es sauberer ist, etwas wie zu verwenden dies: 'return isinstance (field.field.widget, CheckboxInput)'. –

6

{{ field.field.widget.input_type }} erhalten Sie diese Informationen für viele Widgets, aber nicht alle. Ich bin mir nicht sicher, ob es für das Standard-Checkbox-Widget funktioniert oder nicht. Einen Versuch wert.

+1

Denke nicht, dass CheckboxInput dieses Attribut hat ... es scheint jedoch ein 'check_test'-Attribut zu haben ... Ich weiß nicht, ob es für die Checkbox-Eingabe einzigartig ist ... aber es funktioniert jetzt. .. ein bisschen wie ein Hack. – mpen

6

Es ist etwas spät zu beantworten, aber ich habe etwas implementiert, was ähnlich wie in Django Admin ist.

Zuerst habe ich ein neues Attribut is_checkbox auf die Klasse Field:

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

Dann kann ich leicht einen CheckboxInput Widget in der Vorlage erkennen. Hier ist ein Beispiel zu machen Kontrollkästchen links und andere Widgets nach rechts:

{% if field.field.is_checkbox %} 
    {{ field }} {{ field.label_tag }} 
{% else %} 
    {{ field.label }} {{ field }} 
{% endif %} 
Verwandte Themen