首页 > 解决方案 > 如何将用户上传的 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 文件的文件名。如何将内容呈现为网页?谢谢

标签: djangodjango-modelsdjango-templatesdjango-admin

解决方案


您应该阅读您上传的html文件,然后将其渲染为string. 为此,您可以使用codecsmark_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 %}

推荐阅读