Django: An welcher Stelle models für die Ausgabe filtern?

Django, Flask, Bottle, WSGI, CGI…
Antworten
Barret Wallace
User
Beiträge: 5
Registriert: Sonntag 22. Februar 2015, 09:02

Hallo,

ich beschäftige mich seit Kurzem mit Django. In meiner Anwendung möchte ich so etwas darstellen:

HAUPTGRUPPE 1:
- Untergruppe A
- Untergruppe C
- Untergruppe F

HAUPTGRUPPE 2:
- Untergruppe B
- Untergruppe D

Keiner Hauptgruppe zugeordnet:
- Untergruppe E

Dazu habe ich Haupt- und Untergruppen in den models.py als Klassen definiert. Nun frage ich mich allerdings, an welcher Stelle ich die Filterung für die Ausgabe machen sollte:
- Als Methode einer Klasse in den models.py?
- In den views.py?
- Im template?

Freue mich über jeden Hinweis!

Hier sind meine models.py (auf das Wesentliche beschränkt):

Code: Alles auswählen

class Organisationseinheit(models.Model):
    uid = models.CharField(max_length=10, unique=True, null=False, blank=False)
    bezeichnung = models.CharField(max_length=200, unique=False, null=False, blank=False)
    class Meta:
        abstract = True

class Hauptgruppe(Organisationseinheit):

class Untergruppe(Organisationseinheit):
    hauptgruppe = models.ForeignKey(Hauptgruppe, null=True, blank=True, default=None)
Und hier die views.py:

Code: Alles auswählen

class AuflistungUntergruppen(ListView):
    model = Untergruppe
    context_object_name = 'untergruppen'
...und das template:

Code: Alles auswählen

<table class="table">
  <thead>
    <tr>
      <th>UID</th><th>Bezeichnung</th>
    </tr>
  </thead>
  <tbody>
    {% for ug in untergruppen.all|dictsort:'uid' %}
    <tr>
      <td>{{ ug.uid }}</td><td>{{ ug.bezeichnung }}</td>
    </tr>
    {% endfor %}
  </tbody>
</table>
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Nie im Template. Prinzipiell im View es kann aber ggfs. Sinn machen sowas im Model als Methode auf einem eigenen Manager zu machen. Solange sich dir allerdings noch grundlegende Fragen wie diese stellen, würde ich von letzterem abraten.
Barret Wallace
User
Beiträge: 5
Registriert: Sonntag 22. Februar 2015, 09:02

Vielen Dank. Hört sich auf jeden Fall sinnvoll an, es über die View-Klasse zu realisieren. Wäre dann ein ListView immer noch sinnvoll? Ich würde ja keine reine Liste mehr an das Template übergeben, sondern eher eine Art HashMap oder Dictionary der Art Hauptgruppe --> Liste der Untergruppen.
Barret Wallace
User
Beiträge: 5
Registriert: Sonntag 22. Februar 2015, 09:02

Ich glaube, ich verstehe langsam... Ich sollte vielleicht keine Class-based View verwenden, sondern eine Funktion, in der ich dann zunächst das dictionary mit allen Haupt- und Untergruppen zusammen bastle und dieses Objekt dann an ein Template übergebe.

Aber wo platziere ich den Filter, um nach Hauptgruppen aufzuteilen? In einer Methode der Klasse Hauptgruppe? Oder der Klasse Untergruppe? Oder in einem separaten Manager (oder wäre das unnötig kompliziert)?
Piet Lotus
User
Beiträge: 80
Registriert: Dienstag 14. November 2006, 10:40

Hallo Barret Wallace,
wieso willst du keine "class-based views" mehr verwenden?
Warum willst du ein extra Dictionary mit Haupt- und Untergruppen zusammenbasteln?
Du kannst deine Models zu Haupt- und Untergruppen doch ineinander hängen, sprich in deine Hauptgruppen jeweils die gewünschten Untergruppen einhängen, also z.B. one-to-many-Relation aufbauen - eine Hauptgruppe hat n Untergruppen.
Dann kannst du über ein QuerySet in der View deine Hauptgruppe abfragen, an denen deine Untergruppen hängen.
Aber vielleicht ist mir deine Anforderung auch noch nicht ganz klar?
Viele Grüße
Piet Lotus
Antworten