2012-05-30 5 views
5

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:

  1. das Formular in den Ansichten Speicher durch Überschreiben der form_valid Methode; dies aussetzt nicht user_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() 
    
  2. 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?

+0

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

Antwort

2

Es sei denn, Sie so dass Anwender ändern dass ForeignKeyField, gibt es keinen Grund, warum es in einer Form zu schließen - ich mit dem ersten Lösung gehen würde exclude der Verwendung des Benutzerfeld zu halten aus Ihrem ModelForm und Einstellung der Benutzer von request.user. In der Tat, die Django documentation now has an example along these exact lines.

Sie haben den Vorteil, nicht gegen Manipulation des user_id Parameter zu sichern, die nicht Ihre internen Benutzer-IDs aussetzt und nicht um die verschiedenen kümmern vs. aktualisieren Fälle erstellen. Ein kleiner Nachteil ist, dass Sie, wenn Sie jemals die Fähigkeit benötigen, das Objekt User zu ändern, müssen Sie erneut beginnen.

Verwandte Themen