【问题标题】:How do I render user uploaded html file as a page? Django如何将用户上传的 html 文件呈现为页面?姜戈
【发布时间】:2026-01-20 10:10:01
【问题描述】:

这是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 文件的文件名。如何将内容呈现为网页? 谢谢

【问题讨论】:

    标签: django django-models django-templates django-admin


    【解决方案1】:

    您应该阅读您上传的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 %}
    

    【讨论】:

    • 非常感谢!第一个选项完美。你知道如何在渲染 html 文件之前检查用户是否登录吗?
    最近更新 更多