Ich habe mehrere Datenbanktabellen, die mit Fremdschlüsseln verknüpft sind (Sie müssen die grundlegenden Beispiele hier verzeihen, ich habe Probleme beim Kopieren/Einfügen aus meiner Entwicklungsumgebung) .Anzeige der verknüpften Datenbankergebnisse in einer einzigen HTML-Tabelle
# models.py
class Task(models.Model):
details = models.ForeignKey(Details)
task = models.CharField(max_length=1024, null=false)
class Activity(models.Model):
task = models.ForeignKey(Task)
activity = models.CharField(max_length=1024)
class Resources(models.Model):
activity = models.ForeignKey(Activity, null=false)
resources = models.CharField (max_length=1024)
Ich muss diese Ergebnisse in einer einzigen Tabelle anzeigen. Beachten Sie, dass eine Aufgabe keine Aktivitäten haben kann und eine Aktivität möglicherweise keine Ressourcen haben, usw. Zum Beispiel:
- Task1
- Activity1
- Resource1
- Resource2
- Activity2
- Activity1
- Task2
- ... etc ...
Bisher habe ich einen Tisch in meinem forms.py erstellt haben, die alle Felder enthält, die möglicherweise in eine vorhanden sein könnte Datenbankergebnis. Also:
# forms.py
class ViewTable(tables.Table):
task = tables.Column(default=' ')
activity = tables.Column(default=' ')
resource = tables.Column(default=' ')
Ich wurde dann itertools.chain
unter Verwendung der Ergebnisse zusammen in der richtigen Reihenfolge zu verbinden und sie dann in die Vorlage zu machen. Ich bin in einer Sackgasse hier:
# views.py
table = None
for task in tasks:
if table:
table = list(chain(table, task)
else:
table = task
for activity in Activities.objects.filter(tasks=task):
table = list(chain(table, activity))
for resource in Resources.objects.filter(activity=activity):
table = list(chain(table, resource))
return render(request, 'table.html', {'table', table, })
# table.html
<table>
<tr>
<th>Tasks</th>
<th>Activity</th>
<th>Resources</th>
</tr>
{% for item in table %}
<tr>
<th>{{ item.task }}</th>
<th>{{ item.activity }}</th>
<th>{{ item.resource }}</th>
</tr>
{% endfor %}
</table>
Dies, weil funktioniert nicht, wenn ich nur eine Aufgabe hat (und keine Aktivitäten oder Ressourcen), dann das Objekt nicht iterable ist, so bekomme ich einen Fehler, wenn ich versuche es in der Vorlage zu rendern.
Aber insgesamt habe ich das Gefühl, dass dies ein schlampiger und langsamer Weg ist, Dinge zu tun, und ich habe Schwierigkeiten, einen besseren Weg zu finden. Korrekturen oder komplett alternative Empfehlungen sind willkommen!
Das Ziel ist, etwas zu bekommen, die wie folgt angezeigt:
Tasks Activities Resources ------------------------------------- task1 activity1 resource1 resource2 activity2 task2
Nicht sicher, warum Sie django-tables2 in diesem Fall verwenden würden, es scheint auch, dass Sie es überhaupt nicht in Ihrem Ansichtscode verwenden. Abgesehen davon: Wenn Sie einen Fehler bekommen, dass etwas nicht iterierbar ist, sollten Sie überprüfen, ob es ist, bevor Sie versuchen, darüber zu iterieren. – Jieter
Sie haben Recht, ich habe nicht bemerkt, dass 'tables.Table' ein Teil von' django-tables2' war. Dieser Teil ist also nicht notwendig. Meine Frage war, wie ich mir etwas ausdenken sollte, das ich in meinem "Gesamtziel" gepostet habe.Ob das Objekt iterierbar ist (den Code, den ich habe) oder eine komplett andere Lösung ist, ich bin ganz Ohr. –
Hmm, wenn Sie sich Ihre Beispiele ansehen, gibt es mehrere Syntaxfehler ('false' vs.' False', fehlende Klammern). Bitte lesen Sie, wie Sie ein [minimales, vollständiges, überprüfbares Beispiel] (http://stackoverflow.com/help/mcve) bereitstellen können. Es ist nicht notwendig, ein komplettes Djangoprojekt bereitzustellen, aber Ihr Code sollte ohne Syntaxfehler laufen, die Ansicht sollte vollständig sein. und Ihre Modelle ohne externe Abhängigkeiten ... – Jieter