Excluyendo campos en vistas genéricas de CRUD

Tengo un modelo llamado Domain que se parece a esto:

 class Domain(models.Model): """ Model for storing the company domains """ user = models.ForeignKey( User ) host = models.CharField( null=False, verbose_name="Host", max_length=128, unique=True ) 

Me gustaría usar las vistas genéricas de Django para realizar operaciones CRUD en esto. Hay un campo en este modelo que necesita la entrada del usuario, pero el campo de la clave externa no necesita ninguna entrada del usuario. ¿Cómo puedo excluir ese campo del formulario que genera mi vista genérica, pero asignarle el valor del usuario autenticado actual?

Gracias.

Eche un vistazo a la respuesta de Russel a una pregunta similar en el grupo de usuarios de django a principios de esta semana.

Citando la respuesta *:

Las formas y vistas resuelven diferentes problemas.

La Vista está resolviendo el problema de “¿cómo manejo esta solicitud y la convierto en una respuesta?”. El formulario está resolviendo el problema de “¿Cómo convierto los datos POST en esta solicitud en un objeto modelo (o un cambio en un objeto modelo)?”.

A grandes rasgos, una vista está haciendo lo siguiente:

  1. Ver recibe una solicitud
  2. La vista funciona si se trata de un GET o un POST
  3. Si es un POST, View solicita al formulario que convierta la publicación en un cambio de modelo
  4. La forma devuelve el éxito o el fracaso
  5. Ver responde al éxito o fracaso del formulario.
  6. Ver devuelve una respuesta.

La funcionalidad del formulario es un subconjunto completo de la funcionalidad de la vista y, por este motivo, es un componente interno completamente intercambiable.

Ahora, en situaciones simples, es posible que una Vista adivine todos los valores predeterminados para el formulario; todo lo que necesita saber es que se trata de un modelo de Foo y puede construir un Foo ModelForm predeterminado. Sin embargo, si tiene requisitos de formulario más sofisticados, necesitará un formulario personalizado.

Podríamos haber implementado esto al exponer todas las opciones de ModelForm en la clase Ver; pero para mantener todo limpio, mantuvimos el ModelForm aislado y proporcionamos a View una forma de especificar qué clase de formulario utilizará.

Entonces, para cubrir su caso de uso de los campos excluidos, defina un ModelForm que excluya los campos, luego deje que CreateView sepa el formulario que desea usar:

 class CampaignForm(forms.ModelForm): class Meta: model = Campaign exclude = ('user', 'name', 'content_inlined') class CreateCampaignView(CreateView): form_class = CampaignForm template_name = "forms/create.html" 

Supongo que cuando dices “corregir un valor para un campo”, te refieres a configurar los valores de usuario, nombre y content_inlined antes de guardar la nueva instancia de Campaign; para hacer esto, necesita inyectar un código extra en la lógica de procesamiento del formulario:

 class CreateCampaignView(CreateView): form_class = CampaignForm template_name = "forms/create.html" def form_valid(self, form): form.instance.user = ... (something meaningful.. eg, self.request.user) return super(CreateCampaignView, self).form_valid(form) 

Esto anula el comportamiento predeterminado cuando el formulario es válido y establece los valores adicionales. La implementación super () de form_valid () guardará la instancia.

Para el registro, esto también podría hacerse anulando el método save () en el ModelForm. Sin embargo, si lo hace, perderá el objeto de solicitud, que necesitará si está tratando de establecer los valores de instancia en algo. eso es sensible a la solicitud.

* la respuesta original establece self.object.user lugar de form.instance.user . Esto da un AttributeError así que lo he cambiado anteriormente.