Comment sous-classe le CreateView générique de django avec les données initiales?
j'essaie de créer un dialogue qui utilise jquery .fonction load() pour siphonner dans un rendu django forme. Le. la fonction load est transmise à la pk de l'objet" alert". Aussi disponible dans les fonctions de classe sont des choses comme self.request.user
ainsi je peux pré-remplir ces champs, montrés ci-dessous dans le modèle de Message (models.py):
class Message(models.Model):
user = models.ForeignKey(User)
alert = models.ForeignKey(Alert)
date = models.DateTimeField()
message = models.TextField()
Subclassant la CreateView de django, il est assez facile de générer un contexte avec une instance de la forme du modèle (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)
le le problème ici est que self.initial
n'est pas rendu avec le formulaire. J'ai assuré que le formulaire est effectivement appelant get_initial
et l'instance form a les données initiales appropriées dans post
, mais quand le formulaire est rendu dans le template message.html
il ne saisit aucune des données initiales comme je m'y attendais. Existe t il une astuce pour obtenir que cela fonctionne? J'ai parcouru les docs (il semble manquer des exemples sur les vues de classe génériques) et les sources, mais je ne vois pas ce que je manque.
2 réponses
get_initial()
devrait simplement retourner un dictionnaire, ne pas se donner la peine de définir self.initial
.
Votre méthode devrait ressembler à quelque chose comme ceci:
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
(Édité parce que ce que vous essayez en fait de travail)
j'ai rencontré le même problème hier, mais ça marche maintenant – je pense que je retournais un objet au lieu d'un dict en get_initial
.
En termes de résoudre votre problème, je suis un peu suspect de la façon dont beaucoup vous semblent être en train de faire dans post()
– pourriez-vous essayer avec la valeur par défaut (non-surdéfini) post()
?
vous pouvez aussi utiliser pdb
(ou instructions d'impression) pour vérifier la valeur de self.get_form_kwargs
assurez-vous que initial
.