0

J'utilise Django 1.8 pour créer une application. J'ai un modèle de lien et un modèle de commentaire qui a le lien comme ForeignKey. J'utilise des vues génériques pour générer un LinkDetailView et un CommentaireCreateView et les afficher dans des fichiers modèles séparés, puis inclure un commentaire dans le modèle de détail de lien. Voici le code:Comment passer une vue de formulaire à une autre vue en tant que contexte dans django?

views.py

class LinkDetailView(DetailView): 
    models  = Link 
    queryset = Link.objects.all() 

    def get_context_data(self, **kwargs): 
     context = super(LinkDetailView, self).get_context_data(**kwargs) 
     context['form'] = CommentForm 
     return context 

class CommentCreateView(CreateView): 
    form_class = CommentForm 
    template_name = "comments/comment_form.html" 


    def form_valid(self, form): 
     link = get_object_or_404(Link, pk=form.data["link"]) 
     f = form.save(commit=False) 
     f.user = self.request.user 
     f.link = link 
     f.save() 
     return super(CommentCreateView, self).form_valid(form) 

link_detail.html

{% block content %} 
. . . 
{% include "comments/comment_form.html" %} 
{% endblock %} 

comment_form.html

<h2>Add Comment</h2> 
<form action="" method="POST"> 
    {% csrf_token %} 
    <table> 
     {{ form.as_p }} 
    </table> 
    <input type="submit" name="submit" value="Submit" /> 
</form> 

Le formulaire apparaît dans la page de détail du lien, mais lorsque je clique sur le bouton Soumettre, il ne va nulle part [je vois l'erreur "POST /links/1/slug/ HTTP/1.1" 405 0 dans le shell] et ne sauvegarde évidemment pas dans la base de données. Je ne suis pas sûr si j'ai choisi l'approche correcte pour le faire, donc toute aide serait appréciée.

Répondre

2

J'ai résolu le problème en utilisant FormMixin est ici le docs

et voici comment l'views.py ressemble maintenant:

class LinkDetailView(FormMixin, DetailView): 
    models  = Link 
    queryset = Link.objects.all() 

    form_class = CommentForm 

    def get_success_url(self): 
     return reverse('link_detail', kwargs={'pk': self.object.pk, 'slug': self.object.slug}) 

    def get_context_data(self, **kwargs): 
     context = super(LinkDetailView, self).get_context_data(**kwargs) 
     context['form'] = self.get_form() 
     return context 

    def post(self, request, *args, **kwargs): 
     if not request.user.is_authenticated(): 
      return HttpResponseForbidden() 
     self.object = self.get_object() 
     form = self.get_form() 
     if form.is_valid(): 
      return self.form_valid(form) 
     else: 
      return self.form_invalid(form) 

    def form_valid(self, form): 
     link = get_object_or_404(Link, pk=self.object.pk) 
     print link 
     f = form.save(commit=False) 
     f.user = self.request.user 
     f.link = link 
     f.save() 
     return super(LinkDetailView, self).form_valid(form)