如何让HttpResponse打印新行?

时间:2017-10-03 11:10:26

标签: django httpresponse

def index(request):
    review = Review.objects.all()
    output = "\n".join([each_review.review_text for each_review in review])

    return HttpResponse(output)

我得到的输出是

"This book 1 is very great This book 2 is very great This book 3 is very great This book 4 is very great This book 5 is very great This something is very great"

但它不打印它们之间的新线。如何使用HttpResponse来实现这一目标?

2 个答案:

答案 0 :(得分:6)

默认HttpResponse有" text / html"作为content-type,html忽略换行符(或者更确切地说将它们视为空格)。

如果你想要一个text / html响应内容,你必须用相应的html标记替换换行符(使用"
"而不是换行或换行每行a""或"

"等)。您还需要将整个内容包装到一个合适的html文档中,IOW添加父级""和""您的内容周围的标签等。

如果纯文本内容类型没问题,只需在回复中设置内容类型标题:

return HttpResponse(output, content_type="text/plain")

所以浏览器知道正确解释和渲染它。

作为旁注:您使用orm和str.join()的方式效率非常低。

首先,str.join()采用任何可迭代(只要所有项都是字符串),因此您不需要构建list - 您可以使用生成器表达式即(通知表达式周围缺少括号):

output = "\n".join(each_review.review_text for each_review in review)

但是,如果您只对模型中的单个字段感兴趣,则加载整个字段并构建模型实例会完全浪费数据库和python代码级别的资源。这里的解决方案是使用QuerySet.value_list()代替(此处将flat标志设置为True,因为我们只需要一个字段):

output = "\n".join(Review.objects.values_list("review_text", flat=True))

答案 1 :(得分:2)

你得到一个HTML,所以你应该使用 output = "<br>".join([each_review.review_text for each_review in review])

<pre>

output = "\n".join([each_review.review_text for each_review in review]) output = "<pre>{}</pre>".format(output)

{{1}}