Ganze Tabellenzelle als Link mit django_tables2

Django, Flask, Bottle, WSGI, CGI…
Antworten
Semo
User
Beiträge: 2
Registriert: Sonntag 23. Januar 2011, 02:09

Hallo Community

Ich versuche mich schon eine ganze Weile mit dj und stoße an Grenzen, was das Erzeugen und Benutzen einer auf einem Model basierende Tabelle angeht.

Ziel:
Als Benutzer möchte ich einen Tupel (Datensatz bzw. Record) in einer Liste anklicken können und auf Art Update-Seite mit einem Formular geleitet werden.

Was funktioniert:
Die Tabelle wird angezeigt und alle kompletten Datensätze werden gelistet.

Was nicht funktioniert:
Die Datensätze haben keine Funktion, über die ein einzelner Datensatz aufgerufen werden kann, um diesen zu verändern.

Ich weiß nicht so genau, wie ich das anfangen soll und habe im Web nach Beispielen und Problemen gesucht, aber war nicht fündig geworden. An welcher Stelle beginne ich? Mache ich ein ganz speziellen html Template, oder benutze ich sowas wie LinkColumn des django_tables2 packages? Ich habe etwas Code von den Stellen beigefügt, wo meiner Meinung nach der Hase im Pfeffer liegt. Mit den man-pages von django_tables2 konnte ich nicht viel anfangen, weil ich keinen Bezug zu meinem Problem herstellen konnte.

Code: Alles auswählen

url(r'^mainCMS/update/(\d+)/$', mainCMS.views.CreateProjectView.as_view(), name='project-update'),

Code: Alles auswählen

{% extends './assembly.html' %}
{% load render_table from django_tables2 %}

{% block content_in_center %}
<h2>Liste der dbform-Projekte</h2>
<ul>
    {% render_table table %}
</ul>
{% endblock %}

Code: Alles auswählen

import django_tables2 as tables
from django_tables2.utils import *  # alias for Accessor
from mainCMS.models import DbfProjects


class ProjectTable(tables.Table):
	projectid = tables.Column()
	link = tables.LinkColumn('project_detail', kwargs={"projectid" : Accessor('project_detail')})
	# edit_link = tables.LinkColumn('project-update', args=[A('pk')], verbose_name='edit',)


	class Meta:
		model = DbfProjects
Model-Spalten:
owners, description, projectName, prefix, fsLocation, ipV4, ipV6, dbUser, dbPassword, dbName, isDeleted, dateOfCreation, lastTimeChanged

Eine Ansicht:
Bild

Bislang habe ich jede Menge ausprobiert, bis auf die Sache mit den HTML-Templates. Um aber hier nicht Codemüll zur Verwirrung abzuliefern, habe ich eine gestrippte Version des Codes veröffentlicht. Ich hoffe Ihr könnt mir erklären, was/wann/warum zu coden ist. In verschiedenen Büchern, die ich mir gekauft bzw. geliehen und gelesen habe, wird immer nur sehr flach auf Datenbearbeitungsthemen eingegangen. Vielen Dank!

Viele Grüße,
Semox
Piet Lotus
User
Beiträge: 80
Registriert: Dienstag 14. November 2006, 10:40

Hallo Semox,
wenn ich dich richtig verstehe möchtest du einfach eine Zeile in einer Tabelle auswählen und den Inhalt dann, z.B. zur Bearbeitung auf einer anderen Seite anzeigen lassen.
Am einfachsten machst du das, indem du ein "Context-Objekt" aus einer view-Funktion an ein Template übergibst oder entsprechendes in Generic Views implementierst, bzw. schon fertige ListView verwendest. Dieses Context-Objekt beinhaltet z.B. eine Liste mit Objekten mit deren IDs - notfalls musst du diese Info halt "manuell" dazupacken, wenn du nicht gesamte Objekte übergibst. Das Template baust du dann etwa so auf (Nur schematisch und nicht vollständig!):

Code: Alles auswählen

...
{%for object in object_list%}
<tr>
      <td>
            <a href={%url "<<objekt_aktualisieren>>" object.pk %}>
                 <img src="<<static/.../...png>>" alt="Objekt anzeigen">
            </a>
       </td>
       <td>{{<<object.tabellenzeileneintrag_spalte1>>}}</td>
       <td>{{<<object.tabellenzeileneintrag_spalte...>>}}</td>
       <td>{{<<object.tabellenzeileneintrag_spalteN>>}}</td>
</tr>
{%endfor%}
...
Die <<...>> sind dann entsprechend zu ersetzen und du hast dann eine HTML-Tabelle wo hier z.B. durch ein Iconlink und über "objekt.pk" eine andere URL aufgerufen werden kann, über die man einen Dialog zur Bearbeitung des Tabelleneintrags öffnen kann. Der pk wird dann mitgegeben. Du kannst natürlich auch eine neue URL mit dem pk des Objektes selbst zusammenbauen.
Ich hoffe, dass hilft dir weiter...
Viele Grüße
Piet Lotus
P.S. Sorry, hatte übersehen, dass du django_tables2 nutzen möchtest...dann hilft meine Antwort leider weniger...:-(
Semo
User
Beiträge: 2
Registriert: Sonntag 23. Januar 2011, 02:09

Vielen Dank Piet Lotus

Ich habe das mal versucht einzubinden. Das ist mir nicht gelungen. Der Laie staunt und der Fachmann wundert sich. Was mir geholfen hat, war mal zu sehen, wie so ein schematischer Aufbau einer Tabelle aussehen kann. Es ist ganz schön schwierig mit den Template Tags, wie ich finde.

Auf dieser Seite habe ich einen Hinweis zur Verwendung von django_tables2 gefunden: http://kuttler.eu/post/using-django-tab ... -together/
Was mich wundert ist beispielsweise dies. Gibt es in django keine Tabellen, sondern nur Forms? Im erweiterten Sinn sind Tabellen ja auch nur Formulare. Denn es ist seltsam, dass so wenig zu dynamischen und klickbaren Records in einer Tabelle zu finden ist. Analog ist ja auch die Bezeichnungen der Komponenten des MVC in django verdreht worden, wenn man es mit anderen Frameworks vergleicht.

Ich vermute ich benötige 2 Loops. Der eine ist für die Zeilen der andere für die Spalten. Wobei ich mich frage, was ich für

Code: Alles auswählen

{%for object in object_list%}
in das Feld "object" übergeben sollte. Ist das ein Queryset, oder muss das ein String sein, oder ist das eine schon strukturierte HTML Anweisung bzw. ein komplettes HTML Script für eine Zeile einer Tabelle? Da passiert so Vieles und Unergründliches durch django, was keine Kritik sein soll.

Viele Grüße,
Semo
Piet Lotus
User
Beiträge: 80
Registriert: Dienstag 14. November 2006, 10:40

Hallo Semo,
ich hoffe, du hast in der Zwischenzeit nicht aufgegeben. Django macht echt Spaß! :D
Leider habe ich im Moment kaum Zeit, bedeutet, ich konnte mir "django_tables2" nicht anschauen.
Aber zu deinen generellen Fragen kann ich was schreiben. Natürlich gibt es in Django auch die Möglichkeit, Forms und Tabellen zugleich auf eine HTML-Seite zu bringen. Ich geh mal davon aus das du mit Forms Formular-Elemente meinst, wie Input-Fields usw. und mit Tabellen, dann die Datenanzeige in Tabellenform. Das geht mit Generic Views(Class based views) oder über den klassischen Weg der üblichen views-Methoden (Function based views). Klassisch könntest du die Input-Fields in einem Dictionary-Eintrag für die Form speichern und die Tabelle in einem weiten Dictionary-Eintrag anderen Namens. In der HTML-Seite kannst du dann über die Namen darauf zugreifen…
Ich vermute ich benötige 2 Loops. Der eine ist für die Zeilen der andere für die Spalten. Wobei ich mich frage, was ich für ...
Nein, du brauchst du nur eine Schleife. Die Spalten bekommst du automatisch durch den Inhalt der object-Attribute. Das object befüllst du in der View-Methode. z.B. hat das Objekt die Attribute a, b, c, d. Also object.a,object.b,
object.c,object.d. Das Objekt packst du dann über z.B. eine Liste oder Queryset in ein Dictionary, wie z.B. andere Objekte aus einer Datenbanktabelle(deinem model mit den Tabellenspalen a,b,c,d). Anmerkung, das ist dann in meinem vorigem Post der Inhalt von “object_list”. Auf der HTML-Seite referenzierst du dann für Tabellen-Spalte A, object.a , für Spalte B, object.b und wenn du das Attribut c in der Tabelle nicht benötigst, dann machst du halt keine Spalte C mit object.c, sondern machst z.B. weiter mit Spalte d...das Attribut c steht dann im Objekt, wird aber halt nicht angezeigt. Sicherlich kannst du dir auch die benötigten Spalten manuell in der views-Methode zusammen bauen - da gibt es einige Wege, den Inhalt in eine HTML-Datei zu bringen.
“object” ist nur eine Referenzvariable in der for-Schleife des Templates wie bei einer normalen for schleife auch. es könnte auch zeile, blumentopf oder sonst was heißen. In der Tabellenstuktur müsstest du dann die Tabellenattribute über zeile.a, blumentopf.a, usw. referenzieren. Persönlich würde ich "object" durch einen sprechenderen Namen ersetzen, um den Quellcode klarer zu machen. Das ist jetzt nur so eine Abstraktion, weil ich nicht weiß, mit welchen fachlichen Objekten du genau arbeitest, object wird aber auch out-of-the-box von den Generic Views verwendet, dann könnte man die HTML-Seiten mit Generic Class Views und den Function-Bases-Views benutzen...aber das wird wohl nur noch verwirrender. :D Ich hoffe, du konntest folgen...

Viele Grüße
Piet
P.S. Zu MVC bei Django, da ist die Interpretation ein wenig abweichend zur “üblichen” Interpretation, aber um diese Fragestellung zu diskutieren wäre ein neuer Thread sinnvoller – wenn es solch eine Diskussion nicht schon im Forum gibt :)
Antworten