Django: alternatywa dla Form.as_table()

Domyślna struk­tura generowana przez metodę django.forms.Form.as_table pozostawia nieco do życzenia. Stąd nieco wygod­niej­sza i niein­wazyjna wer­sja w postaci fil­tra (zastanawiam się, czemu ta wbudowana w Django ma postać metody):

from django.template.loader import render_to_string

@register.filter
def as_table(form):
    return render_to_string('form_as_table.html', {'form': form})

Do kom­pletu przy­kładowy szablon:

{% for f in form %}
{% if f.errors %}
    <tr class="{{ f.name }} errors">
        <td colspan="2">
            <div class="error">{{ f.errors }}</div>
        </td>
    </tr>
{% endif %}
    <tr class="{{ f.name }} {% if f.errors %}errors{% endif %}">
        <th>{{ f.label_tag }}:</th>
        <td>
{% if f.help_text %}
            <span>{{ f.help_text }}</span>
{% endif %}
            {{ f }}
        </td>
    </tr>
{% endfor %}

2 Responses to “Django: alternatywa dla Form.as_table()”


  • Stan­dar­dowo as_table jest metodą dlatego, że wszyst­kie spo­soby na proste wyświetlanie forma są jego metodami. To natomiast jest wymagane, by {{ form }} wyświetlało zawar­tość forma — gdzieś w definicji jest zaszyte, że form.__str__ to wywołanie as_table.

  • tak widze ze sie znowu zacząłęś o django roz­pisywać więc mam dla Ciebie quiz:

    def jakisview(request):
    [blah blah…]
    s = {
    ‘foo’ : ‘bar­bar’,
    ‘foo2’ : ‘bee’
    ‘RefNo.’ : 9320,
    }
    return render_to_response(„t.html”, s)

    Pytanie brzmi — jak w samym tem­placie dostac sie do war­tosci 9320 ?
    Ina­czej mówiąc jak zmusić django do potrak­towania kropki za RefNo jako nazwy klucza zamiast akcji?

Leave a Reply