2012-05-30 13 views
5

Si prega di considerare questo come una domanda. Forse qualcuno utilizzerà una delle soluzioni qui sotto.Utente Django NascostoInput vs. salvataggio diretto nelle viste con viste basate sulle classi

Ho un paio di modelli che contengono un campo ForeignKey(User). Le mie viste create basate sulla classe derivano dal generico CreateView.

Ci sono due opzioni per salvare l'utente associato quando si aggiunge un nuovo oggetto:

  1. Salvare la forma nelle viste Di override del metodo form_valid; questo non espone user_id (e altri non menzionati qui i dati che non dovrebbero essere esposti)

    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. Salvare il modulo con ID utente memorizzato (e vista) in un campo nascosto. Ecco la parte difficile. Ci sono più modelli con campo utente ... quindi quando si crea un modulo ho bisogno di riempire il campo utente con l'utente iniziale (attualmente connesso) e inoltre ho bisogno di rendere quel campo nascosto. A tal fine ho usato il mio 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 
    

Non ci sono più CreateXXXView utilizzando il OwnFormMixin ..

Come si fa a salvare i dati utente nei moduli?

Nascosto rispetto al salvataggio direttamente nelle visualizzazioni? Cosa sono i pro/contro?

+0

Perché non usi request.user durante la convalida? C'è la possibilità di rispondere a POST a da un altro utente? Perché persino esporre qualsivoglia correlazione con i dati utente di django in forma o in qualsiasi parte visibile. È una potenziale vulnerabilità ... – garmoncheg

risposta

2

A meno che non si sta consentendo agli utenti di modificare che ForeignKeyField, non c'è motivo di includere in una forma - mi piacerebbe andare con la vostra prima soluzione di utilizzare exclude per tenere il campo utente dal vostro ModelForm, e l'impostazione l'utente da request.user. Infatti, lo Django documentation now has an example along these exact lines.

si ha il vantaggio di non dover garantire contro la manipolazione del parametro user_id, non esporre i vostri ID utente interna e non doversi preoccupare della diversa Crea vs. casi Update. Un piccolo svantaggio è che se hai mai avuto bisogno di cambiare la proprietà di un oggetto User devi ricominciare.

Problemi correlati