2016-03-19 7 views
0

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.

+0

Können Sie den Rest des Traceback geben? – jonrsharpe

Antwort

1

Klassenbasierte Ansichten funktionieren nicht so; Die URL muss auf die Klasse selbst verweisen, die von as_view zurückgegeben wird, sie werden automatisch an die Methoden get oder post gesendet, und Sie können überhaupt nicht auf eine beliebige Methode umleiten.

Definieren Sie eine separate Funktion oder Klasse für Ihre comment Ansicht.

+0

Können Sie mir bitte ein Beispiel geben, das auf meinem Code basiert? – mfgabriel92

+0

Ich habe dir gesagt, was zu tun ist: nimm 'Kommentar' aus der Klasse und mache es zu einer separaten Funktion. Es gibt keinen Grund dafür, dass es in der Klasse ist, es ist nicht auf etwas angewiesen (obwohl ich nicht verstehe, was du tun sollst; derzeit leitet es zurück zu sich selbst, was nur eine Endlosschleife verursachen wird). –

+0

Ich aktualisierte meine Frage mit der Lösung basierend auf Ihrer Antwort. – mfgabriel92

Verwandte Themen