Bitte dies als eine Überlegung Frage. Vielleicht wird jemand eine der folgenden Lösungen verwenden.Django-Benutzer HiddenInput vs. direkt in Ansichten mit klassenbasierten Ansichten speichern
Ich habe ein paar Modelle, die ein ForeignKey(User)
Feld enthalten. Meine klassenbasierten create views werden vom generischen CreateView
abgeleitet.
Es gibt zwei Optionen, um die zugeordneten Benutzer zu speichern, wenn ein neues Objekt hinzufügen:
das Formular in den Ansichten Speicher durch Überschreiben der
form_valid
Methode; dies aussetzt nichtuser_id
(und andere nicht hier genannten Daten, die nicht ausgesetzt werden sollte)class CreateOfferView(CreateView): model = Offer form_class = SomeModelFormWithUserFieldExcluded def form_valid(self, form): instance = form.save(commit=False) instance.user = self.request.user instance.save()
das Formular mit Benutzer-ID gespeichert (und ausgesetzt) in einem versteckten Feld Speichern. Hier ist der knifflige Teil. Es gibt mehr Modelle mit Benutzerfeld ... so wenn ich ein Formular anlege, muss ich das Benutzerfeld mit dem ursprünglichen (gegenwärtig eingeloggten) Benutzer füllen und ich muss dieses Feld auch verstecken. Zu diesem Zweck habe ich meine
OwnFormMixin
class OwnFormMixin(object): def get_form(self, form_class): form = super(OwnFormMixin, self).get_form(form_class) form.fields['user'].widget = forms.HiddenInput() def get_initial(self): initial = super(OwnFormMixin, self).get_initial() initial['user'] = self.request.user.pk #I could also do this in get_form() with form.fields['user'].initial class CreateOfferView(OwnFormMixin, CreateView): model = Offer form_class = SomeModelFormWithAllFields
Es gibt mehr CreateXXXView
mit der OwnFormMixin
..
verwendet Wie Sie Ihre Benutzerdaten in den Formularen speichern Sie?
Versteckt vs. direkt in Ihren Ansichten speichern? Was sind Vor-/Nachteile?
Warum verwenden Sie request.user nicht bei der Validierung? Gibt es eine Möglichkeit, POST a von einem anderen Benutzer zu beantworten? Warum sollten Sie überhaupt irgendwelche mit Django-Benutzerdaten in Verbindung stehenden Daten oder irgendwelche sichtbaren Teile offenlegen. Es ist eine potenzielle Schwachstelle ... – garmoncheg