it-swarm.com.de

Django-Vorlage: Auf leere Abfragesätze prüfen

Gibt es eine Möglichkeit, nach einem leeren Abfragesatz in der Django-Vorlage zu suchen? Im folgenden Beispiel soll der NOTES-Header nur angezeigt werden, wenn Notizen vorhanden sind.

Wenn ich ein {% empty%} in das "for" setze, zeigt es alles an, was sich im leeren Tag befindet, damit es weiß, dass es leer ist.

Ich hoffe auf etwas, bei dem die Abfrage nicht zweimal ausgeführt wird.

{% if notes - want something here that works %}
     NOTES:
     {% for note in notes %}
         {{note.text}}  
     {% endfor  %}
{% endif  %}

Erläuterung: Das obige Beispiel "Wenn Notizen" funktioniert nicht - es zeigt die Kopfzeile auch bei leerem Abfragesatz an.

Hier ist eine vereinfachte Version der Ansicht

sql = "select * from app_notes, app_trips where"
notes = trip_notes.objects.raw(sql,(user_id,))

return render_to_response(template, {"notes":notes},context_instance=RequestContext(request))  

Bearbeiten: Die Ansicht Auswahl wählt aus mehreren Tabellen.

14
user984003

Versuchen Sie es mit {% if notes.all %}. Für mich geht das.

16
Miketsukami

Schauen Sie sich das Tag {% empty%} an. Beispiel aus der Dokumentation

<ul>
{% for athlete in athlete_list %}
    <li>{{ athlete.name }}</li>
{% empty %}
    <li>Sorry, no athletes in this list.</li>
{% endfor %}
</ul>

Link: https://docs.djangoproject.com/de/1.8/ref/templates/builtins/#for-empty

14
Thales Ceolin

Überprüfen Sie aus Ihrer Sicht, ob notes leer ist oder nicht. Wenn ja, übergeben Sie stattdessen None:

{"notes": None}

In Ihrer Vorlage verwenden Sie {% if notes %} wie gewohnt.

5
Simeon Visser

Es ist bedauerlich, dass Sie mit einem unformatierten Abfragesatz nicht weiterkommen - es fehlt ihnen eine Menge nützlicher Verhaltensweisen.

Sie können den rohen Abfragesatz in eine Liste in der Ansicht konvertieren:

notes_as_list = list(notes)
return render_to_response(template, {"notes":notes_as_list},context_instance=RequestContext(request))

Dann überprüfe es als Boolean in der Vorlage:

{% if notes %}
    Header
    {% for note in notes %}
        {{ note.text }}
    {% endfor %}
{% endif %}

Sie können dies auch ohne Konvertierungen mit forloop.first durchführen:

{% for note in notes %}
    {% if forloop.first %}
         Header
    {% endif %}
    {{ note.text }}
{% endfor %}
4
Peter DeGlopper

Ihre originelle Lösung

{% if notes %}
    Header
    {% for note in notes %}
        {{ note.text }}
    {% endfor %}
{% endif %}

Funktioniert jetzt mit Django 1.7 und kostet dank QuerySet-Caching keine zusätzliche Abfrage.

1
Laszlo Marai

Wie wäre es mit:

{% if notes != None %}
    {% if notes %}
        NOTES:
        {% for note in notes %}
            {{ note.text }}  
        {% endfor  %}
    {% endif %}
{% else %}
    NO NOTES AT ALL
{% endif %}
1
matino

wie bezogen von: hier

{% for book in books %}
<li>{{ book }}</li>
{% empty %}
<li>Sorry, there are no books.</li>
{% endfor %}
0
eaithy