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.
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
Sie tun das mit dem Code "form_valid", den Sie oben gezeigt haben, wiederum in einem if-Block, der die Berechtigung prüft. –