2016-03-19 9 views
0

Oluşturduğum formda bir yorum göndermeye çalışırken bu hatayla karşılaşıyorum. , Başlık olarak,ilişkisiz yöntem comment() GetPostView örneğiyle ilk bağımsız değişken olarak çağrılmalıdır (bunun yerine WSGIRequest örneği var)

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) 
] 

ve: Buraya

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) 

, urls.py:

Bu CommentForm ve test amaçlı bir HttpResponseRedirect dönen bir yöntem ile sınıf görünüşüdür formu gönderdiğimde hata görüntülenir:

ilişkisiz yöntem c omment() ilk argüman olarak GetPostView örneği ile çağrılmalıdır

Django yeniyim ve bana yardım için başka bir durum hem mayın bulamadı (WSGIRequest örneği yerine var).

** Çözüm **

Daniel kredi ve puan hak çünkü benim söz konusu çözüm koyacağız.

""" 
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,))) 

Ve yeni url: Yalnızca yorumlara izin gibi mükemmel hale getirmek için yapılacak çok şey olmasına rağmen

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) 
] 

bir var onun cevabını ardından, bu yaparak çözdü kullanıcı giriş yapmış, bu iyi bir başlangıç.

+0

Geri kalan parçanın geri kalanını verebilir misiniz? – jonrsharpe

cevap

1

Sınıf tabanlı görünümler şu şekilde çalışmıyor; url, as_view'dan döndürüldüğü gibi sınıfa kendisini işaret etmelidir, bunlar get veya post yöntemlerine otomatik olarak gönderilir ve rasgele bir yönteme yönlendiremezsiniz.

comment görünümünüz için ayrı bir işlev veya sınıf tanımlayın.

+0

Koduma dayanarak bana bir örnek verebilir misiniz, lütfen? – mfgabriel92

+0

Size ne yapacağınızı anlattım: 'comment' öğesini sınıftan çıkarın ve ayrı bir işlev haline getirin. Zaten sınıfta olmasının bir sebebi yok, oradaki herhangi bir şeye güvenmiyor (ne yapmak istediğinizi anlamamasına rağmen, şu anda kendi kendine geri dönüyor, bu da sonsuz bir döngüye neden olacak). –

+0

Sorumu, cevabınıza dayalı çözümle güncelledim. – mfgabriel92

İlgili konular