2010-01-23 7 views
5

J'essaie d'utiliser l'application de commentaires dans mon projet.Django: Rediriger vers l'article actuel après le commentaire

J'ai essayé d'utiliser le code ({% render_comment_form pour% d'événement}), indiqué dans la documentation ici: Django comments

Et la question est de savoir comment faire la forme de redirection à la même page, après la présentation. Aussi la grande question


est: Actuellement, si nous avons une erreur trouvée dans le car, nous sommes redirigés vers modèle de prévisualisation. Est-ce possible d'éviter ce comportement et d'afficher les erreurs sur le même formulaire (sur la même page)?

Répondre

1
+0

bon conseil ... En fait, il y a une redirection plus laid ... Pour avoir un aperçu sous forme (surtout quand il y a des erreurs). Puis-je afficher des erreurs sur le même formulaire (sans ouvrir la nouvelle page) –

+0

J'ai toujours les mêmes problèmes avec les commentaires. C'est un peu plus de travail, mais je finis généralement par tout faire par Ajax. Je détourne l'action submit() du formulaire et envoie un message à la vue de soumission de commentaire. De cette façon, vous pouvez gérer les erreurs sans quitter la page, rediriger vers où vous voulez ou rester sur la page et simplement mettre le nouveau commentaire dans la liste de façon dynamique. Il y a une application sur bitbucket pour vous aider. Blog à ce sujet à http://brandonkonkle.com/blog/2009/oct/24/dry-ajax-comments/. Voici un autre exemple: http://www.nomadjourney.com/2009/01/using-django-templates-with-jquery-ajax/ – Tom

+0

Est-ce moi ou est-ce une solution inflexible? Cette solution vous permet uniquement d'utiliser les commentaires django dans un seul cas pour l'ensemble de votre application. Imaginons que vous créez une galerie de photos, en effet, vous ne pourrez pas utiliser les commentaires sur chaque photo à moins de traiter chaque photo comme un article de blog. – killerbarney

5

Je vais vous montrer comment je résolus dans mon blog, pour que vous puissiez faire quelque chose de similaire. Mes commentaires sont pour le modèle d'entrée dans l'application entrées.

Commencez par ajouter une nouvelle méthode pour votre objet Entrée (similaire).

def get_absolute_url(self): 
    return "/%i/%i/%i/entry/%i/%s/" % (self.date.year, self.date.month, self.date.day, self.id, self.slug) 

Il génère l'URL pour les objets d'entrée. exemple URL:/2009/12/12/entrée/1/lorem ipsum-/

Pour urls.py ajouter 1 ligne:

(r'^comments/posted/$', 'smenteks_blog.entries.views.comment_posted'), 

Alors maintenant, vous devez avoir au moins 2 lignes pour les commentaires dans votre urls.py fichier.

(r'^comments/posted/$', 'smenteks_blog.entries.views.comment_posted'), 
(r'^comments/', include('django.contrib.comments.urls')), 

Pour les entrées (comme) l'application dans le fichier views.py fonction ajouter:

from django.contrib.comments import Comment #A 
... 
def comment_posted(request): 
    if request.GET['c']: 
     comment_id = request.GET['c'] #B 
     comment = Comment.objects.get(pk=comment_id) 
     entry = Entry.objects.get(id=comment.object_pk) #C 
     if entry: 
      return HttpResponseRedirect(entry.get_absolute_url()) #D 
    return HttpResponseRedirect("/")  
  • A) Importer au-dessus de fichier pour avoir accès pour objet de commentaires,
  • B) Get comment_id formulaire DEMANDE,
  • C) aller chercher objet d'entrée,
  • D) Utiliser la méthode get_absolute_url pour effectuer la redirection correcte .

maintenant:

  • bouton Poster sous forme de commentaires sur le site d'entrée redirige l'utilisateur sur le même site (entrée).
  • Le bouton Publier sur le site de prévisualisation redirige l'utilisateur sur le site approprié (entrée).
  • Aperçu bouton dans la forme de commentaire sur le site d'entrée et sur le site d'aperçu redirige l'utilisateur sur le site de prévisualisation
  • Merci page n'est plus en usage (Cette page était assez ennuyeux à mon avis).

La prochaine chose à faire est de remplacer l'aperçu.Modèle html:

  • Allez dans le répertoire django, sous linux il pourrait être/usr/share/pyshared /.
  • Get modèle preview.html d'origine de DJANGO_DIR/contrib/commentaires/templates/commentaires/preview.html
  • Copie à des modèles direcotry dans votre projet PROJECT_DIR/templates/commentaires/entries_preview.html
  • A partir de maintenant, Il doit remplacer le modèle par défaut. Vous pouvez modifier s'étend de cette façon: {% étend "your_pagelayout.html"%} pour que votre mise en page et tous les fichiers CSS fonctionnent.
1

Jetez un oeil à "Django-1.4/django/contrib/commentaires/templates/commentaires /" dossier et vous verra dans le fichier « form.html », il y a la ligne

{% if next %}<div><input type="hidden" name="next" value="{{ next }}" /></div>{% endif %} 

Par conséquent, l'avis d'article Détail, vous pouvez inclure l'attribut « suivant » dans les données de contexte, et le cadre de commentaires sera faire le reste

class ArticleDetailView(DetailView): 
    model = Article 
    context_object_name = 'article' 

    def get_context_data(self, **kwargs): 
     context = super(ArticleDetailView, self).get_context_data(**kwargs) 

     context['next'] = reverse('blogs.views.article_detail_view', 
      kwargs={'pk':self.kwargs['pk'], 'slug': self.kwargs['slug']}) 
     return context 
0

Il s'agit d'une redirection très simple à implémenter. Il vous redirige vers la page où le commentaire a été fait.

Lorsqu'un commentaire est posté, l'url commente/posted/appelle la vue comment_posted qui redirige ensuite vers la page de référence.

Assurez-vous de remplacer [app_name] par le nom de votre application.

views.py

from urlparse import urlsplit 

def comment_posted(request): 
    referer = request.META.get('HTTP_REFERER', None) 
    if referer is None: 
     pass 
    try: 
     redirect_to = urlsplit(referer, 'http', False)[2] 
    except IndexError: 
     pass 
    return HttpResponseRedirect(redirect_to) 

urls.py

(r'^comments/posted/$', '[app_name].views.comment_posted'), 
Questions connexes