Как разобрать "src" тега изображения в текстовом поле Django?
В моем HTML шаблоне есть код следующего содержания
<div class="blog-content">
{{post.text|safe|linebreaks}}
<p><img src="{{ image_dict.1.url }}" alt=""></p>
</div>
Вышеуказанное изображение прекрасно отображается в HTML. Мой вид выглядит следующим образом
def post_detail(request, slug):
post = BlogPost.objects.get(slug=slug)
images = post.images.all()
image_dict = {}
for image in images:
image_dict[image.image_order] = image.image
print(image.image)
return render(request, 'blog/post_detail.html', {
'post': post,
'images': images,
'image_dict': image_dict,
})
В основном я настраиваю его так, чтобы я мог выводить изображения через {{image_dict.image_order.url}}
Но я хочу отобразить изображения следующим образом, чтобы связать их с каждым абзацем текста так
Однако, пока код в шаблоне оценивает url изображения, например, для изображения с порядком '1'
<p><img src="{{ image_dict.1.url }}" alt=""></p> becomes
<p><img src="/media/images/codewithlewis.png" alt=""></p>
Точно такой же код, который я набрал в текстовом поле django (как прикреплено на изображении выше) остается как
<p><img src="{{ image_dict.1.url }}" alt=""></p>
внутри HTML и, конечно же, ничего не отображается.
Я довольно новичок в Django, но мне кажется, что я перепробовал все. Как я могу исправить это? Спасибо.
Похоже, что вы храните Django Template в TextField (вместо вашей папки templates).
Если это так, то вам нужно использовать движок шаблонов Django для рендеринга этого текстового поля, подобно тому, как Django рендерит файлы шаблонов.
Вот полный рабочий пример того, как отобразить строку в виде шаблона.
from django.template import Context, Template
image_dict = {
0: {"url": "https://google.com"},
1: {"url": "https://amazon.com"},
}
my_template_snippet = Template(my_model_instance.my_text_field)
my_rendered_template_snippet = my_template_snippet.render(
Context({"image_dict": image_dict})
)
В вашем представлении это может выглядеть следующим образом.
from django.template import Context, Template
def post_detail(request, slug):
# Get BlogPost
post = BlogPost.objects.get(slug=slug).prefetch_related("images")
# Construct image_dict
images = post.images.all()
image_dict = {}
for image in images:
image_dict[image.image_order] = image.image
# Convert my_text_field to Template
my_template = Template(post.my_text_field)
# Render Template using image_dict
my_template_rendered = my_template.render(Context({"image_dict": image_dict}))
# Set BlogPost.my_text_field to the Rendered Template
post.my_text_field = my_template_rendered
return render(
request,
"blog/post_detail.html",
{
"post": post,
"images": images,
"image_dict": image_dict,
},
)