Many2Many Field backward field

Django, Flask, Bottle, WSGI, CGI…
Antworten
Septias
User
Beiträge: 73
Registriert: Freitag 24. Juni 2016, 19:15

Donnerstag 28. Juni 2018, 19:54

Ich habe diese zwei Models:

Code: Alles auswählen

class Team(models.Model):
    name = models.CharField(max_length=20, blank=True)

    def __str__(self):
        return self.name


class Spiel(models.Model):
    begin = models.DateTimeField()
    end = models.DateTimeField()
    name = models.CharField(max_length=30, default="Namenslos :O")
    teams = models.ManyToManyField(Team, blank= True, default='Für dieses Spiel gibt es keine Mitspieler')

    def __str__(self):
        return self.name

    class Meta:
        ordering = ('begin',)

Jetzt möchte ich auf der Adminseite von den Teams die Spieler hinzufügen, oder löschen können. Bei den Spielen kann ich die Spiele einfach mit dem Feld 'teams' anzeigen und bearbeite.

Wie kann ich zumindest mal die Many2Many relation für die Spieler in 'Team-Adminview' darstellen ?
Bolitho
User
Beiträge: 50
Registriert: Donnerstag 21. Juli 2011, 07:01
Wohnort: Stade / Hamburg
Kontaktdaten:

Donnerstag 28. Juni 2018, 20:06

Ich kann das gerade nicht nachstellen, aber hier ist die Doku: https://docs.djangoproject.com/en/2.0/r ... any-models

so müsste das passen, wie gesagt (ungetestet):

Code: Alles auswählen

#admin.py
... 

class SpielInline(admin.TabularInline):
    model = Spiel
    extra = 1

class TeamAdmin(admin.ModelAdmin):
    inlines = (SpielInline,)

admin.site.register(Team, TeamAdmin)

...
Septias
User
Beiträge: 73
Registriert: Freitag 24. Juni 2016, 19:15

Donnerstag 28. Juni 2018, 22:03

Wenn ich den von dir bereit gestellten Code direkt übernehme, bekomme ich:

Code: Alles auswählen

<class 'anmeldung.admin.SpielInline'>: (admin.E202) 'anmeldung.Spiel' has no ForeignKey to 'anmeldung.Team'.
Aber so wie ich das sehe würde ich dann eher so ein Interface wie in dem Django-Tutorial bekommen (https://docs.djangoproject.com/en/2.0/intro/tutorial07/)Bild

Und eigentlich will ich schon vorher angemeldete Personen dem Team zuordnen, und nicht neue erstellen, die dann auch noch fest an das Team gebunden sind. So wie wenn ich bei den Spielen durch ein mulitple-choice-widget die Teams auswählen kann, die teilnehmen sollen. Aber anscheinend gibt es ja kein Feld, was ich einfach dem AdminModel übergenen kann, wodurch es angezeigt wird.

Muss ich wohl nach einem anderen Weg suchen... trotzdem danke ^^
Bolitho
User
Beiträge: 50
Registriert: Donnerstag 21. Juli 2011, 07:01
Wohnort: Stade / Hamburg
Kontaktdaten:

Freitag 29. Juni 2018, 07:02

gestern Abend war zu spät für mich und man sollte nicht helfen wollen, ohne selbst absolut sicher zu sein

So sollte es sein, oder?
Bild

Code: Alles auswählen

#admin.py

from django.contrib import admin
from .models import Spiel, Team

class SpielInline(admin.TabularInline):
    model = Spiel.teams.through

class TeamAdmin(admin.ModelAdmin):
    inlines = (SpielInline,)

admin.site.register(Team, TeamAdmin)
admin.site.register(Spiel)
Septias
User
Beiträge: 73
Registriert: Freitag 24. Juni 2016, 19:15

Freitag 29. Juni 2018, 14:28

Ja, das ist es. Vielen Dank :)
Schon komisch, wie oft ich das mit dem through field schon gelesen habe, aber nicht sehen konnte, dass ich genau danach gesucht habe ._. xD
Septias
User
Beiträge: 73
Registriert: Freitag 24. Juni 2016, 19:15

Donnerstag 2. August 2018, 13:03

Wie kann ich das Ganze für eine ForeignKey machen ?
Das selbe Szenario, ich habe ein Spieler mit einem ForeignKey zu einem Team. Nun will ich in der Team-Adminview Spieler dem Team zuweisen, aber keine neuen erstellen.
Ich dachte eigentlich, dass man das auch mit dem through-Attribut (Spieler.team.through) machen könnte, aber das gibt es bei ForeignKeys nicht.

Lg Septias
Antworten