Ich habe eine Methode, die eine neue Comment
in die Basis einfügt, und nachdem es dies getan hat, leitet es zurück zum vorherigen Post, der beliebig sein kann. Also, das zu tun, habe ich die folgende Regel:Übergeben von URL-Parametern zum Rendern
return redirect(reverse('blog:post', args = (post_id,)))
Damit wird die Seite zurück zum vorherigen Post
umgeleitet gelesen werden, durch die id
an die URL übergeben.
Das Problem ist jetzt, wenn das Formular nicht gültig ist. Ich möchte Fehlermeldungen anzeigen, aber ich denke, dass das Formular jetzt neu erstellt wird und jede Nachricht gelöscht wird. Also, in der else
Bedingung möchte ich, anstatt umzuleiten, es wieder rendern und die Nachrichten zeigen. Ich habe es so gemacht:
return render(request, 'blog/post.html', post_id = post_id)
Aber dann muss ich wieder auf die gleiche Seite bekommen war ich, unabhängig von der id
im Parameter. Ich muss die post_id
übergeben, wie ich in der redirect
Funktion tat, aber ich kann einen Weg nicht finden.
Das ist die ganze Methode:
def write_comment(request, post_id):
"""
Write a new comment to a post
"""
form = CommentForm(request.POST or None)
if form.is_valid():
post = Post.objects.get(pk = post_id)
post.n_comments += 1
post.save()
comment = Comment()
comment.comment = request.POST['comment']
comment.created_at = timezone.now()
comment.modified_at = timezone.now()
comment.post_id = post_id
comment.user_id = 2
comment.save()
return redirect(reverse('blog:post', args = (post_id,)))
else:
# Need to pass the parameter here, in order to not recreate the form
return render(request, 'blog/post.html')
verwendet Meine Klassenansicht durch die URL auf seiner id
je die Post
, anzuzeigen:
url(r'^post/(?P<id>[0-9]+)/$', views.GetPostView.as_view(), name = 'post'),
Und die GetPostView
:
class GetPostView(TemplateView):
"""
Render the view for a specific post and lists its comments
"""
template_name = 'blog/post.html'
def get(self, request, id):
return render(request, self.template_name, {
'post': Post.objects.get(pk = id),
'comments': Comment.objects.filter(post = id).order_by('-created_at'),
'form': CommentForm()
})
Fast. Die Nachricht wird endlich angezeigt, aber ich muss noch die 'post_id' erhalten. Die Seite ist diese URL '/ post/ /', und ich muss die Seite auf dieser Seite rendern. –
mfgabriel92
Also, wenn Sie die Formularvalidierungsfehler rendern, möchten Sie den Beitrag auch? Ich sehe nichts für die Post in dieser Methode (abgesehen von der Weiterleitung). Gibt es eine andere Methode dafür? – bpscott
Ja, die Klassenansicht zum Anzeigen des Posts gemäß der ID in der URL. Schau bitte meine bearbeitete Frage. – mfgabriel92