2013-07-10 59 views
2

我是django的新手。我有一个观点的新闻应用程序,这使得页面每个新闻:表单对象没有属性'has_header'

def news_page(request, news_id): 
    news = News.objects.get(pk=news_id) 
    tags = news.tags.all() 
    category = news.category 
    comments = news.comment_set.all() 
    form = add_comment(request, news.id) 
    return render(request, 'news/news_page.html', {'form': form, 'news': news, 'tags': tags, 'category': category, 'user': request.user, 'comments': comments}) 

而且我已经创建注释的应用程序: models.py:

class Comment(models.Model): 
    author = models.ForeignKey(User) 
    comment_body = models.CharField(max_length=500) 
    news = models.ForeignKey(News) 
     pub_date = models.DateTineField(default = datetime.datetime.now()) 

forms.py:

class AddCommentForm(ModelForm): 
    comment_body = forms.CharField(widget=forms.Textarea) 

    class Meta(): 
     model = Comment 
     exclude = ('author', 'news','pub_date',) 

我会尝试实现comments.view功能add_comment其中news_page视图(上面)使用:

def add_comment(request, news_id): 
    news = News.objects.get(pk=news_id) 
    if request.method == 'POST': 
     form = AddCommentForm(request.POST) 
     if form.is_valid: 
      comment = form.save(commit=False) 
      comment.author = request.user 
      comment.news = news 
      comment.save() 
    else: 
     form = AddCommentForm() 
    return form 

但我有错误'AddCommentForm'对象没有属性'has_header'。我认为这是因为add_comment视图没有HttpResponse。我应该如何重写代码才能使这个想法发挥作用。 错误追溯

Internal Server Error: /news/15/comment/ 
Traceback (most recent call last): 
    File "C:\Python27\myproject\djcode\first_venv\venv\lib\site-packages\django\core\handlers\base.py" 
, line 187, in get_response 
    response = middleware_method(request, response) 
    File "C:\Python27\myproject\djcode\first_venv\venv\lib\site-packages\django\contrib\sessions\middl 
eware.py", line 26, in process_response 
    patch_vary_headers(response, ('Cookie',)) 
    File "C:\Python27\myproject\djcode\first_venv\venv\lib\site-packages\django\utils\cache.py", line 
142, in patch_vary_headers 
    if response.has_header('Vary'): 
AttributeError: 'AddCommentForm' object has no attribute 'has_header' 

谢谢!

回答

8

从视图中您需要返回response对象,但是您返回表单对象。因此错误。

您可以使用render代替

变化

return form 

return render(request, template_name, {'form': form}) 
+0

我应该用什么值替换template_name? – Leval

+0

添加到要渲染表单的模板。如果它是一个ajax请求,你可以做一些像'return HttpResponse(simplejson.dumps({'form':form}))' – karthikr

+0

但是这个模板(在第一个函数中呈现)需要其他一些参数。所以如果我写return return(request,'news/news_page.html',{'form':form}),它会引发错误NoReverseMatch at/news/15/comment/ Reverse'for category'with arguments'('', )'和关键字参数'{}'未找到。 – Leval

0

karthikr是正确

您还可以使用

return render_to_response('template_name',{'form':form})