2015-03-31 80 views
1

下面的Django模板代码是否存在DRY简写?Django模板中的条件链接

{% if condition %} 
    <a href="{% url 'url_name' arg1 arg2 kwarg='some value' %}"> 
    {# just some block of code #} 
    <h2>{{ value|capfirst }}</h2> 
    </a> 
{% else %} 
    {# the same block of code #} 
    <h2>{{ value|capfirst }}</h2> 
{% endif %} 

回答

0

如果你需要保持你的HTML结构,这可能是最可读的方式。

{% if condition %} 
    <a href="{% url 'url_name' arg1 arg2 kwarg='some value' %}"> 
{% endif %} 
    <h2>Heading</h2> 
{% if condition %} 
    </a> 
{% endif %} 
+0

我也不想重复这种情况。 – utapyngo 2015-03-31 04:49:16

+0

这只是重复条件两次。 – 2015-03-31 04:49:17

+0

由于django模板本质上是文本,因此它们在嵌套时没有太多的帮助。我不确定这里最简单的方法是什么。如果'Heading'是一个字符串,那么*可能是一个简短的方法,但是鉴于它的任意代码,我不确定它会直接进行,即使使用自定义模板块。 – 2015-03-31 04:53:23

1

就我个人而言,我的代码中没有看到非DRY(可读性胜过DRY,我认为)。

但是,如果必须,您可以创建一个模板标记,根据condition变量的内容呈现链接。在你的标签中,你会有相同的if-loop逻辑。它只会将代码从您的模板移动到标签。尽管如此,我会谨慎的,因为它只是增加了虚荣的复杂性(在我看来)。另外,模板标签/过滤器很难调试。你也可以决定在你的视图代码中建立链接,但是,你将不得不编写相同类型的逻辑结构(if语句)。

也许有人会建议使用JavaScript来修改基于标志的节点,但再次 - 简单性和可读性胜过其他所有内容。

请记住,您将不得不维护此代码。尽管如此,作为code golf exercise这是一个不错的选择。

+0

我以为有一个库提供了这样的标签,所以它可以被重复使用,以避免两次写入所有内容。 – utapyngo 2015-03-31 07:25:00