2016-03-19 2 views
0

Я столкнулся с этой ошибкой при попытке отправить комментарий в форме, которую я создал.unbound method comment() должен быть вызван с экземпляром GetPostView в качестве первого аргумента (вместо этого был получен экземпляр WSGIRequest)

Это вид класса с CommentForm и метод возвращающей HttpResponseRedirect только в целях тестирования:

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:

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

И, как в названии, при отправке формы появляется ошибка:

unbound method c omment() должен вызываться GetPostView например, в качестве первого аргумента (получил WSGIRequest экземпляра вместо)

Я новичок в Django, и я не мог найти любую другую ситуацию, так мой, чтобы помочь мне.

** Решение **

вложу решение в моем вопросе, потому что Даниил заслуживает кредита и очков. После его ответа, я решил ее, делая это:

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

И в новом 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) 
] 

Хотя есть много вещей, чтобы сделать, чтобы сделать его идеальным, как только позволяют комментарии, когда есть пользователь вошел в систему, это хороший старт.

+0

Не могли бы вы предоставить остальную часть трассы? – jonrsharpe

ответ

1

Представления на основе классов не работают; url должен указывать на сам класс, возвращаемый с as_view, они автоматически отправляются методам get или post, и вы не можете вообще перейти к произвольному методу.

Определите отдельную функцию или класс для вашего вида comment.

+0

Не могли бы вы привести пример, основанный на моем коде, пожалуйста? – mfgabriel92

+0

Я сказал вам, что делать: выведите «комментарий» из класса и сделайте его отдельной функцией. В любом случае нет никаких причин для того, чтобы он был в классе, он ни на что не полагался (хотя я не понимаю, чего вы хотите, в настоящее время он перенаправляет обратно к себе, что просто вызовет бесконечный цикл). –

+0

Я обновил свой вопрос с помощью решения, основанного на вашем ответе. – mfgabriel92

Смежные вопросы

 Смежные вопросы