如何将用户上传的 html 文件呈现为页面?姜戈
How do I render user uploaded html file as a page? Django
这是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 %}
models.py:
class notebook(models.Model):
noteb=models.FileField(upload_to="notebooks/")
category=models.TextField(default="")
objects = models.Manager()class
详细视图正在运行,但它只是输出上传的 html 文件的文件名。如何将内容呈现为网页?
谢谢
您应该阅读上传的 html
文件,然后将其呈现为 string
。为此,您可以使用 codecs
and 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
如果您不想使用模板标签,您也可以通过创建新的 function/method 来在 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 %}
这是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 %}
models.py:
class notebook(models.Model):
noteb=models.FileField(upload_to="notebooks/")
category=models.TextField(default="")
objects = models.Manager()class
详细视图正在运行,但它只是输出上传的 html 文件的文件名。如何将内容呈现为网页? 谢谢
您应该阅读上传的 html
文件,然后将其呈现为 string
。为此,您可以使用 codecs
and 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
如果您不想使用模板标签,您也可以通过创建新的 function/method 来在 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 %}