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.

17
demandé sur Xaerxess 2011-04-14 20:34:58

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
24
répondu SmileyChris 2011-06-22 03:37:46

(É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.

0
répondu supervacuo 2012-04-03 14:55:05