在Django中,如何使用模板和DB对象中使用的动态url实现样板HTML变量?

2024-06-11 14:32:17 发布

您现在位置:Python中文网/ 问答频道 /正文

在Django中,我在DB中创建了包含带有动态url的样板HTML的字符串变量,但我无法让它们在我的模板中工作。你知道吗

我使用render\u作为\u模板(https://github.com/danielrozenberg/django-render-as-template/blob/master/render_as_template/templatetags/render_as_template.py),这样动态url就可以工作了。我尝试了自定义模板标记,但是当我使用那些带有render\u作为\u模板的标记时,它无法加载。你知道吗

然后我尝试了一个定制的上下文处理器。我在上下文处理器中创建了两个函数,一个用于超链接,另一个用于工具提示。我让工具提示处理器工作,但我只能通过查询集自动生成的dict中的编号在模板中引用它们。你知道吗

我对超链接处理器做了同样的操作,然后尝试修改它以使用字符串键而不是整数,但它不会加载所有字段。我一定错过了什么。你知道吗

custom_tags.py
from django import template
register = template.Library()

@register.simple_tag
def rdo_hyper():
    value = Boilerplate.objects.filter(name='RDO').values_list('hyperlink',flat=True)
    return value[0]
# It's only going to return one field.
# Expected output: <a href="{% url 'guides:rdo' %}" target=”_blank” rel=”noopener noreferrer”>Foobar</a>


# tried a non-DB version, just in case
@register.simple_tag
def rdo_hyper2():
    value = "<a href=\"{% url \'guides:rdo\' %}\" target=\”_blank\” rel=\”noopener noreferrer\”>Foobar</a>"
    return value
# Expected output: <a href="{% url 'guides:rdo' %}" target=”_blank” rel=”noopener noreferrer”>Foobar</a>
custom_context.py
from myapp.apps.wizard.models import Boilerplate

def boilerplate_hyperlink_processor(request):
    boilerplate_hyper = {
        "foo": Boilerplate.objects.filter(name='Aftermarket').values_list('hyperlink',flat=True),
        "bar": Boilerplate.objects.filter(name='Sights').values_list('hyperlink',flat=True)
    }
    return {'boilerplate_hyper': boilerplate_hyper}
# Expected output of boilerplate_hyper.foo: 
#<a href="{% url 'guides:aftermarket' %}" target=”_blank” rel=”noopener noreferrer”>Aftermarket Support</a>
#
# Expected output of boilerplate_hyper.bar: 
# <a href="{% url 'guides:sights' %}" target=”_blank” rel=”noopener noreferrer”>Sights</a>


def boilerplate_tooltip_processor(request):
    boilerplate_tooltip = Boilerplate.objects.values_list('tooltip',flat=True)
    return {'boilerplate_tooltip': boilerplate_tooltip}
# Expected output of boilerplate_tooltip.0: 
#<sup><a href="{% url 'guides:sights' %}" target=”_blank” rel=”noopener noreferrer” data-html="true" class="fas fa-info-circle pr-2" aria-hidden="true" data-toggle="tooltip" data-placement="top" title="Insert helpful tooltip info here.<br/><strong>Click</strong> for more info."></a></sup>
template.html
{% load static %}
{% load custom_tags %}
{% rdo_hyper as rdo_hyper %}
{% rdo_hyper2 as rdo_hyper2 %}
{% load render_as_template %}
...
<html>

{% autoescape off %}

1. {% rdo_hyper %} 
2. {{ rdo_hyper }} 
3. {% rdo_hyper2 %} 
4. {{ rdo_hyper2 }} 
5. {% render_as_template rdo_hyper %} 
6. {{ boilerplate_hyper.foo }} 
7. {% render_as_template boilerplate_hyper.foo %} 
8. {% render_as_template boilerplate_tooltip.0 %}

{% endautoescape %}

{# The hyperlink value is: 
<a href="{% url 'guides:aftermarket' %}" target=”_blank” rel=”noopener noreferrer”>
Aftermarket Support</a> #}

</html>

在模板.html,出现以下情况:

  1. 呈现,但动态URL失败。你知道吗
  2. 完全不呈现变量。否则页面加载正常。你知道吗
  3. 呈现,但动态URL失败。你知道吗
  4. 完全不呈现变量。否则页面加载正常。你知道吗
  5. 完全不呈现变量。否则页面加载正常。你知道吗
  6. 仅呈现“售后支持”]>;“而不是数据库中的完整超链接字段。你知道吗
  7. 抛出此错误:
TemplateSyntaxError:  
In template <unknown source>, error at line 1.
Could not parse the remainder: '\'guides:aftermarket\'' from '\'guides:aftermarket\''
1   <QuerySet ['<a href="{% url \'guides:aftermarket\' %}" target=”_blank” rel=”noopener noreferrer”>Aftermarket Support</a>']>
  1. 很好用。你知道吗

很好,{%render\u as\u template样板文件\u tooltip.0%}可以工作,但我更愿意通过字符串键引用模板中的变量。毕竟,Django模板语言的特点是它的模板可以被非程序员读写。有什么想法吗?你知道吗


Tags: 模板urltargetastemplaterenderhyperrel
1条回答
网友
1楼 · 发布于 2024-06-11 14:32:17

我回去尝试自定义标签,这似乎是工作:

custom_tags.py
@register.simple_tag(takes_context=True)
def rdo_hyper2(context):
    value = "<a href=\"{% url \'guides:rdo\' %}\" target=\”_blank\” rel=\”noopener noreferrer\”>Foobar</a>"
    rendered = context.template.engine.from_string(value).render(context)
    return rendered
template.html
{% load custom_tags %}
...
{% rdo_hyper2 %}

在DB字段中包含{%rdo\u hyper2%}或其他自定义标记时,我还必须在该字段的顶部使用{%load custom\u tags%},否则它每次抛出:

Invalid block tag on line 12: 'rdo_hyper2'. Did you forget to register or load this tag?

希望这不是资源密集型的!你知道吗

相关问题 更多 >