2

Diese Frage kann auch wie formuliert werden: "Wie Ändern von Attributen eines generierten CreateView-Formulars?"Deaktivieren Sie das Formularfeld in Djangos CreateView

Ich verwende "CreateView", um eine Ansicht und verwandtes Formular in Django 1.10 zu generieren. Die Idee ist, dass ein normaler Benutzer (ein Lehrer) eine Instanz des Modells nur als sich selbst erstellen kann, aber ein privilegierter Benutzer kann eine Instanz erstellen und jedem Lehrer zuweisen. Ich möchte für beide die gleiche Ansicht/Form verwenden.

Das Modell:

class Set(models.Model): 
    name = models.CharField(
     max_length=40, 
    ) 
    matter = models.ForeignKey(
     Matter, 
     on_delete=models.SET_NULL, 
     null=True, 
    ) 
    group = models.ForeignKey(
     Group, 
     on_delete=models.SET_NULL, 
     null=True, 
    ) 
    teacher = models.ForeignKey(
     Teacher, 
     on_delete=models.PROTECT, 
    ) 

Technisch wäre es bestehen auf das Formular mit den aktuellen „Lehrern“ bevölkert angemeldet und das Feld deaktivieren, wenn der aktuelle Benutzer privilegiert ist. Ich mache derzeit die Anfangswerteinstellung mit dem folgenden Code, aber ich kann nicht verhindern, dass reguläre Benutzer das Feld "Lehrer" ändern.

class SetCreate(LoginRequiredMixin, CreateView): 
    model = Set 
    fields = ('name', 'matter', 'group', 'teacher') 

    def get_initial(self): 
     return {'teacher': self.request.user.teacher.id} 

    # code to limit 'teacher' field editing 

Eine weitere Option, die ich versuchte, ist die Instanz mit dem richtigen ‚Lehrer‘ zu schaffen, wie:

class SetCreate(LoginRequiredMixin, CreateView): 
    model = Set 
    fields = ('name', 'matter', 'group') 

    def form_valid(self, form): 
     form.instance.teacher = self.request.user.teacher 
     return super(SetCreate, self).form_valid(form) 

Es funktioniert gut, aber ich kann es nicht von einem privilegierten die ‚Lehrer‘ Feld bearbeiten verwenden Benutzer.

Ich weiß, dass das 'Field.disable' Attribut zu Formularfeldern existiert, aber ich weiß nicht, wie man die Attribute von CreateView generierten Formularen, wenn möglich, ändert.

Eine andere Option wäre, die Optionen in der Dropdown-Liste im Formular zu begrenzen, aber ich weiß auch nicht, wie es geht.

Alle Ratschläge einschließlich einer anderen Sichtweise sind willkommen.

Antwort

2

Mit Blick auf den Code generieren die Bearbeitungsansichten ein Formular innerhalb von get_form_class basierend auf dem Wert des Attributs fields. Das ist als ein Klassenattribut definiert, aber der Code referenziert es tatsächlich über self.fields, so dass es keinen Grund gibt, es nicht auf Instanzebene zu überschreiben. Also, Sie könnten dies tun:

class SetCreate(LoginRequiredMixin, CreateView): 
    model = Set 
    fields = ('name', 'matter', 'group') 

    def get_form_class(self, *args, **kwargs): 
     if self.request.user.has_the_right_permission(): 
      self.fields += ('teacher',) 
     else: 
      self.fields = self.fields 
     return super(SetCreate, self).get_form_kwargs(*args, **kwargs) 

(Der scheinbar sinnlos else-Block, um sicherzustellen, ist, dass wir immer eine Instanz Variable.)

+0

schön aussehen, aber es wäre nur sinnvoll, für eine Bearbeitung Form, keine erstellen bilden. Im Erstellungsmodus würde ein regulärer Benutzer tatsächlich ein "Lehrer" -Feld definieren, aber nur als er selbst. Im Idealfall kann es gelöst werden, indem das Attribut "disabled" im Feld "teacher" zum Zeitpunkt der Generierung des Formulars festgelegt wird, aber ich weiß nicht, welche Methode zu überschreiben ist. – jjchico

+0

Sie tun das mit dem Code "form_valid", den Sie oben gezeigt haben, wiederum in einem if-Block, der die Berechtigung prüft. –

Verwandte Themen