queryset mixin get_context_data generic form createview based django-forms django-views django-class-based-views

django forms - mixin - ¿Cómo hacer una subclase del CreateView genérico de django con datos iniciales?



django generic class (2)

get_initial() debería simplemente devolver un diccionario, no se moleste en establecer self.initial .

Tu método debería verse más o menos así:

def get_initial(self): # Get the initial dictionary from the superclass method initial = super(YourView, self).get_initial() # Copy the dictionary so we don''t accidentally change a mutable dict initial = initial.copy() initial[''user''] = self.request.user.pk # etc... return initial

Intento crear un diálogo que use la función .load () de jquery para sorber en un formulario django renderizado. La función .load se pasa el pk del objeto "alerta". También están disponibles en las funciones de clase cosas como self.request.user así que puedo completar previamente esos campos, que se muestran a continuación en el modelo de mensaje (models.py):

class Message(models.Model): user = models.ForeignKey(User) alert = models.ForeignKey(Alert) date = models.DateTimeField() message = models.TextField()

La creación de subclases de CreateView de django hace que sea bastante fácil generar un contexto con una instancia de ModelForm (views.py):

class MessageDialogView(CreateView): """ show html form fragment """ model = Message template_name = "message.html" def get_initial(self): super(MessageDialogView, self).get_initial() alert = Alert.objects.get(pk=self.request.POST.get("alert_id")) user = self.request.user self.initial = {"alert":alert.id, "user":user.id, "message":"test"} return self.initial def post(self, request, *args, **kwargs): super(MessageDialogView, self).post(request, *args, **kwargs) form_class = self.get_form_class() form = self.get_form(form_class) context = self.get_context_data(form=form) return self.render_to_response(context)

El problema aquí es que self.initial no se procesa con el formulario. Me he asegurado de que el formulario está realmente llamando a get_initial y la instancia del formulario tiene los datos iniciales correctos en la post , pero cuando el formulario se representa en la plantilla message.html no capta ninguno de los datos iniciales, como era de esperar. ¿Hay algún truco especial para que esto funcione? Revisé los documentos (parece que faltan ejemplos en las vistas genéricas de las clases) y fuente, pero no puedo ver lo que me falta.


(Editado porque lo que estás intentando realmente funciona)

Me encontré con el mismo problema ayer, pero está funcionando ahora, creo que estaba devolviendo un objeto en vez de un dict en get_initial .

En cuanto a la solución de su problema, sospecho un poco de cuánto parece estar haciendo en la post() . ¿Podría probarlo con la post() predeterminada (no anulada) post() ?

También puede usar pdb (o instrucciones de impresión) para verificar el valor de self.get_form_kwargs asegurarse de que se está estableciendo la initial .