2012-05-30 10 views
5

Por favor, esto como una pregunta de consideración. Tal vez alguien use una de las soluciones a continuación.Usuario de Django HiddenInput vs guardar directamente en vistas con Vistas basadas en clase

Tengo un par de modelos que contienen un campo ForeignKey(User). Mis vistas de creación basadas en clases se derivan del genérico CreateView.

Hay dos opciones para guardar el usuario asociado al añadir un nuevo objeto:

  1. guardar el formulario en las vistas reemplazando el método form_valid; ello no exponga user_id (y otros que no se mencionan aquí los datos que no deben ser expuestos)

    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. guardar el formulario con id de usuario almacenados (y expuesto) en un campo oculto. Aquí está la parte difícil. Hay más modelos con campo de usuario ... así que al crear un formulario, necesito llenar el campo de usuario con el usuario inicial (actualmente conectado) y también necesito ocultar ese campo. Para este propósito he usado mi 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 
    

Hay más CreateXXXView utilizando el OwnFormMixin ..

¿Cómo guardar los datos de usuario en los formularios?

¿Oculta o no guardando directamente en sus puntos de vista? ¿Cuáles son los pros/contras?

+0

¿Por qué no utiliza request.user en la validación? ¿Existe la posibilidad de responder POST a de otro usuario? Por qué incluso exponer los datos de usuario de django en forma o cualquier parte visible. Es una vulnerabilidad potencial ... – garmoncheg

Respuesta

2

A menos que estés permitiendo a los usuarios modificar que ForeignKeyField, no hay razón para incluirlo en una forma - me gustaría ir con su primera solución de utilizar exclude para mantener el campo de usuario de su ModelForm, y el ajuste el usuario de request.user. De hecho, el Django documentation now has an example along these exact lines.

usted tiene la ventaja de no tener que asegurar contra la manipulación del parámetro user_id, no exponer a sus identificadores de usuario internos y no tener que preocuparse por los diferentes Crear vs casos Actualizar. Una ligera desventaja es que si alguna vez necesita la capacidad de cambiar el User asociado a un objeto, deberá comenzar de nuevo.

Cuestiones relacionadas