the5fire / typeidea

Django企业开发实战对应项目代码
http://django-practice-book.com/
Other
439 stars 214 forks source link

《Django企业开发实战》2020年3月河北第6次印刷第194页代码,解惑??? #45

Closed MaoningGuan closed 4 years ago

MaoningGuan commented 4 years ago

Comment的视图函数代码如下: comment/views.py:

from django.shortcuts import redirect
from django.views.generic import TemplateView

from .forms import CommentForm

class CommentView(TemplateView):
    http_method_names = ['post']
    template_name = 'comment/result.html'

    def post(self, request, *args, **kwargs):
        comment_form = CommentForm(request.POST)
        target = request.POST.get('target')
        content = request.POST.get('content')  # 不知道为什么下面的content会加了p标签
        print(content)

        if comment_form.is_valid():
            instance = comment_form.save(commit=False)
            instance.target = target
            print(instance.content)
            instance.content = content  # 重新赋值,去掉p标签
            instance.save()
            succeed = True
            return redirect(target)
        else:
            succeed = False

        context = {
            'succeed': succeed,
            'form': comment_form,
            'target': target
        }
        return self.render_to_response(context)  

上面的代码和作者书中的代码一样。只是在上面的代码中,分别打印了request.POST.get('content')和instance.content,奇怪的是:instance.content多了一个p标签,打印结果如下: image

所以我在下面的代码重新给instance.content赋值,去掉p标签。

这是什么原因造成上面的结果呢???

MaoningGuan commented 4 years ago

找到原因了,是因为在forms.py中增加了以下代码:

    # 对评论内容进行验证
    def clean_content(self):
        content = self.cleaned_data.get('content')
        if len(content) < 1:
            raise forms.ValidationError('内容长度怎么能这么短呢!!')
        # content = mistune.markdown(content) 
        return content

其中这句代码:

content = mistune.markdown(content) 

把评论内容当成了markdown格式的,然后转成HTML格式的文本,所以加了一个p标签。