Django 提交表单失败回溯:没有返回 HttpResponse 对象



我正在编码一个新网站。

,但我无法成功提交评论。

追溯说:

Exception Type: ValueError at /news-11
Exception Value: The view news.views.NewsDetailView didn't return an HttpResponse object. It returned None instead.

这是我的新闻社模型:

class NewsComments(models.Model):
    user = models.ForeignKey(UserProfile, on_delete=models.CASCADE, verbose_name=u"用户")
    news = models.ForeignKey(News, on_delete=models.CASCADE, verbose_name=u"新闻")
    comments = models.CharField(max_length=200, verbose_name=u"评论")
    parent = models.ForeignKey('self', blank=True, null=True, related_name='children', on_delete=models.SET_NULL)
    add_time = models.DateTimeField(auto_now_add=True, verbose_name='发时')
    last_updated_time = models.DateTimeField(auto_now=True, verbose_name='更时')
    is_delete = models.BooleanField(default=False, verbose_name='删否')
    class Meta:
        verbose_name = "新闻评论"
        verbose_name_plural = verbose_name
        ordering = ['-add_time']
    def __str__(self):
        return self.comments

这是我的新闻/urls.py:

 path('-<int:news_pk>', NewsDetailView.as_view(), name="news_detail"),

这是新闻/views.py:

class NewsDetailView(View):
   def get(self, request, news_pk):
    news = News.objects.get(id=int(news_pk))
    title = news.title
    author = news.author_name
    add_time = news.add_time
    content = news.content
    category = news.category
    tags = news.tag.annotate(news_count=Count('news'))
    all_comments = NewsComments.objects.filter(news=news)
    return render(request, 'news_detail.html',
                  {
                      'title': title,
                      'author': author,
                      'add_time': add_time,
                      'content': content,
                      'tags': tags,
                      'category': category,
                      'all_comments': all_comments
                  })
   def post(self, request, news_pk):
    comment_form = CommentForm(request.POST)
    if comment_form.is_valid():
        comments = comment_form.cleaned_data.get("comment")
        comment = NewsComments(user=request.user,comments=comments,news=News.objects.get(id=news_pk))
        comment.save()
        comment_form = CommentForm
        return render(request, "news_detail.html",
                      {
                          'comment_form': comment_form
                      })

这是注释信息:

def words_validator(comment):
    if len(comment) < 5:
        raise ValidationError("您输入的评论字数太短,请重新输入至少5个字符")

class CommentForm(forms.Form):
    comment = forms.CharField(widget=forms.Textarea(), validators=[words_validator])

这是我的news_detail.html:

                     <form method="post" action="">
                    <div class="form-group">
                        <label for="exampleFormControlTextarea1"><h5>评论 <i class="fa fa-comments"></i></h5></label>
                        <textarea id="js-pl-textarea" class="form-control" rows="4"
                                  placeholder="我就想说..."></textarea>
                        <div class="text-center mt-3">
                            <button type="submit" id='js-pl-submit' class="btn btn-danger comment-submit-button">
                                发表评论
                            </button>
                        </div>
                    </div>
                    {% csrf_token %}
                </form>

Acturaly在管理员中添加一些评论后,我可以成功地在HTML中渲染评论。但是当我尝试提交表单并将注释保存在数据库中时,它总是会失败。

两个选项:

1(通过上下文发送所需的参数,可用于表单操作URL

''' codes '''
def get(self, request, news_pk):
    news = News.objects.get(id=int(news_pk))
    ''' codes '''
    return render(request, 'news_detail.html',{
           #codes
           'title': title,
           'news_pk': news_pk})

html

<form method="post" action="{% url 'news_detail' news_pk %}">{% csrf_token %}
     <div class="form-group"></ div>
</form>

2(无需设置URL,因为模板news_detail.html既是您的视图渲染的模板html,又是接收邮政请求的视图。

<form method="post" action="">{% csrf_token %} <!-- Make sure to keep action blank -->
     <div class="form-group"></ div>
</form>

编辑:

考虑重新定义您的观点

注意更改,函数名称以下字母

开头

views.py

def newsDetailView(request,news_pk):
    news = News.objects.get(id=news_pk)
    title = news.title
    author = news.author_name
    add_time = news.add_time
    content = news.content
    category = news.category
    tags = news.tag.annotate(news_count=Count('news'))
    all_comments = NewsComments.objects.filter(news=news)
    comment_form = CommentForm(request.POST or None)
    if request.method == 'POST' and comment_form.is_valid():
        comments = comment_form.cleaned_data.get("comment")
        comment = NewsComments(user=request.user,comments=comments,news=news)
        comment.save()
    return render(request,"news_detail.html",{
                  'title': title,
                  'author': author,
                  'add_time': add_time,
                  'content': content,
                  'tags': tags,
                  'category': category,
                  'all_comments': all_comments
                  'comment_form': comment_form
              })

urls.py

注意更改,将功能称为下字母,然后删除.as_view()

path('-<int:news_pk>', newsDetailView, name="news_detail"),

相关内容

最新更新