Отображение файла .html в iFrame, загруженного как медиафайл, с помощью Django
Я хочу отобразить загруженный .html
файл в iFrame на моем шаблоне. Я бы не хотел устанавливать его как url для посещения в файле urls.py
, я загружаю .html
файлы из панели администратора в папку media следующим образом:
модель
# Portfolio project overview model
class Work(models.Model):
html = models.FileField(upload_to="work_app/media/htmls/", null=True, blank=True)
settings.py
MEDIA_ROOT = str(BASE_DIR) + "/media/"
MEDIA_URL = '/media/'
STATIC_ROOT = str(BASE_DIR) + "/static/"
STATIC_URL = '/static/'
Моя первая попытка отобразить его, используя этот template.html
код:
{% extends "base.html" %}
{% load static %}
{% block page_content %}
<h1>{{ work.title }}</h1>
<div class="row">
<div class="col-md-8">
{% if work.html %}
<iframe height="100%" width="100%" src="{{ 'work.html.url' }}">
</iframe>
{% endif %}
</div>
</div>
{% endblock %}
... выглядит следующим образом:
Как видите, iFrame отображается, но похоже, что он не может найти .html файл (404).
Я видел в нескольких других сообщениях, что строка html должна быть:
<iframe height="100%" width="100%" src="{% url 'work.html' %}"> </iframe>
... и также добавить X_FRAME_OPTIONS = 'SAMEORIGIN'
в ваш файл settings.py
, так что я сделал оба эти действия, где я теперь получаю:
Что это пытается мне сказать? Что я упускаю?
UPDATE. Я также пробовал:
<iframe height="100%" width="100%" src="{{ work.html }}"> </iframe>
на что я получаю еще один 404:
Я забираю свои слова обратно, мне пришлось очистить кэш или запустить страницу в режиме инкогнито, так как ни одно из моих изменений не отражалось на странице из-за кэша. Как только я это сделал, iframe стал отображаться правильно.
Другой вариант, который я рассматривал, заключался в установке декоратора xframe exemption в представление, которое обрабатывает рендеринг страницы подробностей поста, что выглядело бы примерно так: что тоже вроде бы сработало, но я возвращаюсь к методу SAMEORIGIN from django.shortcuts import render
from django.views.decorators.clickjacking import xframe_options_exempt
# Create your views here.
from .models import Work
@xframe_options_exempt
def work_detail(request, pk):
work = Work.objects.get(pk=pk)
context = {
'work': work
}
return render(request, 'work_detail.html', context)