2017-01-06 2 views
1

Könnten Sie mir bitte helfen zu verstehen, wie die Auswahlmöglichkeiten im Modell funktionieren, wenn es notwendig ist, nach Feld eines anderen Modells zu begrenzen. Derzeit habe ich zwei Modelle:Geben Sie limit_choices_to im Modell dynamisch an

Gruppen:

class Group(models.Model): 
    name = models.CharField(max_length=10, null=True) 
    leader = models.OneToOneField(
     'Student', 
     related_name='+', 
     null=True, 
     blank=True, 
     on_delete=models.SET_NULL, 
     limit_choices_to={'group': 2}, 
    ) 

und Studenten:

class Student(models.Model): 

    group = models.ForeignKey(Group, on_delete=models.PROTECT) 
    name = models.CharField(max_length=140, null=True) 
    brd_date = models.DateField(null=True) 
    ticket = models.IntegerField(null=True, unique=True) 

So wie Sie jeder Schüler sehen hat seine Gruppe (konfiguriert durch ForeignKey). Aber jede Gruppe kann oder darf nicht einen eigenen Führer haben. Es ist nur ein bestimmter Student (konfiguriert von OneToOneField), der aus der Gruppe ausgewählt wird, zu der er/sie tatsächlich gehört. Ohne Einschränkung nach Gruppe wird es möglich, jeden Schüler als Anführer für jede Gruppe auszuwählen. Im bereitgestellten Gruppenmodell habe ich limit_choices_to-Optionen gesetzt, um die Auswahl nur auf die Gruppe 2 zu beschränken (zu Testzwecken).

Ist es möglich, diesen Parameter dynamisch festzulegen und als Ergebnis die Möglichkeit zu haben, eine Form-Klasse basierend auf dem Gruppenmodell zu erstellen, in der die Auswahl für Gruppenleiter nur Schüler in dieser Gruppe zulässt?

Vielen Dank im Voraus.

+0

Mögliche Duplikat http://stackoverflow.com/questions/232435/how-do-i-restrict-foreign-keys-choices-to-related-objects-only-in-django –

+0

Vielen Dank für den Link. Nun ja, es wurden viele Sachen erfunden. Ich wäre jedoch dankbar, wenn jemand den gemeinsamen Ansatz zur Lösung eines solchen Rätsels beschreiben könnte. Ich mag die Idee, einen Zugang zu Studenten aus der Gruppe wie folgt zu verwenden: object.student_set.all(), aber gibt es eine klare Möglichkeit, ein Studentenführerfeld für das Gruppenmodell zu implementieren? – dimdiden

Antwort

0

Ich möchte nur teilen, was mir passt. ich meine Entscheidungen nur begrenzen die Modelform-Klasse:

class GroupForm(ModelForm): 

    class Meta: 
     model = Group 
     fields = '__all__' 

    def __init__(self, *args, **kwargs): 
     super(GroupForm, self).__init__(*args, **kwargs) 

     self.fields['head'].queryset = Student.objects.filter(group=self.instance) 

Wie Sie mit Hilfe von .filter (Gruppe = self.instance) sehen Ich kann meine Entscheidungen begrenzen und die Möglichkeit haben, den Kopf von Studenten der Wahl, die gehören nur zu dieser bestimmten Gruppe.

Dann einfach:

class UpdateGroup(LoginRequiredMixin, UpdateView): 
    model = Group 
    form_class = GroupForm 

Ich nehme an, es ist ein Weg, um das gleiche Ergebnis auf Modellebene zu erreichen, aber ich habe es noch nicht herausgefunden.

Verwandte Themen