Ich stehe vor diesem Fehler, wenn ich versuche, einen Kommentar in der von mir erstellten Form einzureichen. Dieseungebundene Methode comment() muss mit GetPostView-Instanz als erstes Argument aufgerufen werden (stattdessen WSGIRequest-Instanz)
ist die Klassenansicht mit den CommentForm
und einem Verfahren ein HttpResponseRedirect
zu Testzwecken Rückkehr nur:
class GetPostView(TemplateView):
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),
'form': CommentForm()
})
def comment(self, request):
return HttpResponseRedirect(request.path)
In hier die urls.py
:
app_name = 'blog'
urlpatterns = [
url(r'^$', views.IndexView.as_view(), name = 'index'),
url(r'^categories/$', views.CategoriesView.as_view(), name = 'categories'),
url(r'^post/(?P<id>[0-9]+)/$', views.GetPostView.as_view(), name = 'post'),
url(r'^post/(?P<id>[0-9]+)/comment$', views.GetPostView.comment)
]
Und, wie im Titel, Wenn ich das Formular absende, erscheint der Fehler:
ungebundene Methode c omment() muss mit GetPostView Instanz als erstes Argument aufgerufen wird (bekam WSGIRequest Instanz statt)
Ich bin neu in Django, und ich konnte andere Situation gleichermaßen Mine zu helfen, mir nicht finden.
** Lösung **
Ich werde die Lösung in meiner Frage gestellt, weil Daniel den Kredit und die Punkte verdient. Nach seiner Antwort, löste ich es durch, dies zu tun:
"""
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()
})
def write_comment(request, post_id):
"""
Write a new comment to a post
"""
if request.method == 'POST':
form = CommentForm(request.POST)
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()
else:
form = CommentForm()
return redirect(reverse('blog:post', args = (post_id,)))
Und das die neuen url
:
app_name = 'blog'
urlpatterns = [
url(r'^$', views.IndexView.as_view(), name = 'index'),
url(r'^categories/$', views.CategoriesView.as_view(), name = 'categories'),
url(r'^post/(?P<id>[0-9]+)/$', views.GetPostView.as_view(), name = 'post'),
url(r'^post/(?P<post_id>[0-9]+)/comment$', views.write_comment)
]
Zwar gibt es viele Dinge zu tun, es perfekt zu machen, wie nur Kommentare erlaubt, wenn es eine ist Benutzer angemeldet, dies ist ein guter Anfang.
Können Sie den Rest des Traceback geben? – jonrsharpe