django - 如何将用户上传的 html 文件呈现为页面?姜戈
问题描述
这是views.py
def datacategory(request):
book = models.notebook.objects.filter(category='Students')
return render(request,'datasets/students.html',{'notebooks':book})
class DataDetailView(generic.DetailView):
model = models.notebook
template_name = "datasets/data_detail.html"
data_detail.html
{% block body %}
<div style="padding: 2rem;">
{{ notebook.noteb }}
</div>
{% endblock %}
模型.py:
class notebook(models.Model):
noteb=models.FileField(upload_to="notebooks/")
category=models.TextField(default="")
objects = models.Manager()class
详细视图正在工作,但它只是输出上传的 html 文件的文件名。如何将内容呈现为网页?谢谢
解决方案
您应该阅读您上传的html
文件,然后将其渲染为string
. 为此,您可以使用codecs
和mark_safe
模块。例如,我使用templatetags
来处理这个,例如:
可选 1
文件:yourapp/templatetags/html_tags.py
import os
import codecs
from django import template
from django.utils.safestring import mark_safe
register = template.Library()
@register.filter
def read_html_file(html_field):
html_path = html_field.path
if os.path.exists(html_path):
html_string = codecs.open(html_path, 'r').read()
return mark_safe(html_string)
return None
在您的模板中使用它;
{% load html_tags %}
{% block body %}
<div style="padding: 2rem;">
{{ notebook.noteb|read_html_file }}
</div>
{% endblock %}
更新: 如果你想验证只有登录的用户可以看到;
{% load html_tags %}
{% block body %}
<div style="padding: 2rem;">
{% if request.user.is_authenticated %} <!-- add this -->
{{ notebook.noteb|read_html_file }}
{% else %}
<p>You must logged in to see.</p>
{% endif %}
</div>
{% endblock %}
可选 2
如果您不想使用模板标签,您也可以models.py
通过创建新的函数/方法来在文件中处理它来呈现它。
import os
import codecs
from django.utils.safestring import mark_safe
class notebook(models.Model):
noteb = models.FileField(upload_to="notebooks/")
....
def render_notebook(self):
html_path = self.noteb.path
if os.path.exists(html_path):
html_string = codecs.open(html_path, 'r').read()
return mark_safe(html_string)
return None
然后,您可以通过以下方式直接将其调用到您的模板中;
{% block body %}
<div style="padding: 2rem;">
{{ notebook.render_notebook }}
</div>
{% endblock %}
推荐阅读
- php - 如何编写一个处理多个类动作的函数
- android - 条目名称“res/color/material_on_surface_disabled.xml”发生冲突
- python - Plotly:如何避免使用 go.Heatmap 对 x 和 y 类别进行分组?
- javascript - 如何使用 Angular 中的 Tab 键从 mat 下拉列表中选择一个选项
- c++ - 在 C++ 上运行简单的二进制搜索时遇到问题
- javascript - 如何在查询函数中返回数据
- phpmyadmin - raspbian busetr 上的 phpmyadmin 无法登录
- oracle - Oracle SYSDBA 连接
- rust - 如何强制 `async_std` 任务在 rust 的单个线程上运行?
- azure - 使用 Azure 前门时缺少 UserId 属性的应用程序见解