2017-07-14 1 views
0

Je travaille sur un projet de blog où il affiche tous les articles d'un blog sur la page d'accueil. J'ai une fonction d'édition pour chaque entrée de blog et contient deux options: publier et annuler.Django: Problème de redirection vers la page précédente après annulation de l'édition

c'est ce que ma forme ressemble

class PostForm(forms.ModelForm): 
    class Meta: 
     model = Post 
     fields = ('title', 'text',) 

En views.py il ressemble à ceci:

def post_detail(request, pk): 
    post = get_object_or_404(Post, pk=pk) 
    return render(request, 'blog/post_detail.html', {'post': post}) 

En HTML, il ressemble à ceci:

{% extends 'blog/base.html' %} 
{% block content %} 
    <h1>Edit post</h1> 

    <form method="POST" class="post-form">{% csrf_token %} 
     {{ form.as_p }} 
     <button type="submit" class="save btn btn-default" >Publish</button> 
     <a class="btn btn-default" href="{% url 'post_detail' pk=? %}">Cancel</a> 
    </form> 
{% endblock %} 

urls. py

urlpatterns = [ 
    url(r'^$', views.post_list, name='post_list'), 
    url(r'^post/(?P<pk>\d+)/$', views.post_detail, name='post_detail'), 
    url(r'^post/new/$', views.post_new, name='post_new'), 
    url(r'^post/(?P<pk>\d+)/edit/$', views.post_edit, name='post_edit'), 
    url(r'^post/(?P<pk>\d+)/remove/$', views.post_remove, name='post_remove'), 
    url(r'^post/(?P<pk>\d+)/comment/$', views.add_comment, name='add_comment_to_post'), 
    url(r'^comment/(?P<pk>\d+)/remove/$', views.comment_remove, name='comment_remove'), 
    url(r'^comment/(?P<pk>\d+)/edit/$', views.comment_edit, name='comment_edit'), 
] 

Je ne pourrais pas savoir quel est le pk en html. J'ai essayé pk et post.pk mais fonctionne bien. Tout le monde peut aider. Merci

+0

Où est le formulaire auquel vous essayez d'accéder dans vos modèles à l'aide du code '{{form.as_p}}'? Vous devez l'envoyer à travers vos points de vue. Utilisez également un contexte dict() pour résoudre votre problème "pk". Encore une fois, vous ne l'envoyez pas (pk) de votre point de vue. –

+0

essayer 'post.id' –

Répondre

0

Tout d'abord, il n'y a pas un objet de formulaire que vous envoyez à votre html, donc dans votre code,

{{ form.as_p }} ne fonctionnerait pas. En ce qui concerne l'accès à la valeur "pk" dans le template, vous devez l'envoyer via votre contexte dict().

Maintenant que vous avez dit au sujet de la classe de formulaire,

Essayez ceci,

#Import the form from forms.py 
def post_detail(request, pk): 
    post = get_object_or_404(Post, pk=pk) 
    form = PostForm() 
    context = {'post' : post , 'pk' : pk , 'form' : form} 
    return render(request, 'blog/post_detail.html', context) 

Et le modèle devrait ressembler,

{% extends 'blog/base.html' %} 
{% block content %} 
<h1>Edit post</h1> 

<form method="POST" class="post-form">{% csrf_token %} 
    {{ form.as_p }} 
    <button type="submit" class="save btn btn-default" >Publish</button> 
    <a class="btn btn-default" href="{% url 'post_detail' pk=pk %}">Cancel</a> 
</form> 
{% endblock %} 

Remarque: Je ne Je ne sais pas pourquoi vous essayez d'envoyer un objet modèle "Post" aux modèles. Mais je l'ai gardé dans le code.

+0

Merci d'avoir répondu. Ce modèle a été initialement utilisé pour créer un nouveau post et en éditer un. Comme je voudrais ajouter plus de fonctions à chacun, je sépare les modèles mais j'utilise toujours le même format. J'ai essayé votre code mais ne fonctionne toujours pas, j'ai reçu cette erreur msg "NoReverseMatch Reverse pour 'post_detail' avec les arguments '(' ',)' non trouvé 1 pattern (s) essayé: ['post/(? P \ \ d +)/$ '] " – hakuro

+0

Aussi si je change l'url dans href =" {% url' post_detail 'pk%} "à d'autres qui n'ont pas besoin d'un pk cela fonctionne très bien. – hakuro

+0

Pouvez-vous me montrer votre urls.py? et pourquoi mettez-vous 'href =" {% url 'post_detail' pk%} 'dans la balise d'ancrage pour annuler l'option? –