1

我对 Django 和 HTML 很陌生。我的模板中有以下内容:

{% if user.is_authenticated  %}
    <a href='{% url 'vote' %}' id='story-vote-{{ story.id }}' class='vote'><img src='{{ STATIC_URL }}images/arrow.gif'></a>
{% else %}
    <a href='{% url 'login' %}' id='story-vote-{{ story.id }}' class='vote'><img src='{{ STATIC_URL }}images/arrow.gif'></a>
{% endif %}

所以只有 URL 不同,但 id 和 image 是一样的。如何避免这种重复?我会做这样的事情:

{% var link %} {# pseudo-code #}
{% if user.is_authenticated  %}
    link = 'vote'
{% else %}
    link = 'login'
{% endif %}
<a href='{% url link %}' id='story-vote-{{ story.id }}' class='vote'><img src='{{ STATIC_URL }}images/arrow.gif'></a>

这是个好主意吗?我知道 Django 不支持局部变量,但是有站点包可以解决这个问题。还是更好地处理视图中的逻辑并link作为参数传递给模板?

那么真正的 Django 方式是什么?

4

3 回答 3

4

真正的 Django 方式来处理视图的逻辑或为此创建用户方法。你可以在views.py

def index(request):
    def can_vote():
        if request.user.is_authenticated:
            return 'vote'
        return 'login'

    user = request.user
    user.vote = can_vote
    ...

然后在模板中你可以

<a href='{% url user.vote %}' id='story-vote-{{ story.id }}' class='vote'><img src='{{ STATIC_URL }}images/arrow.gif'></a>
于 2013-10-12T08:15:32.257 回答
3

如果唯一不同的是链接,您当然可以将其全部放在一行中:

<a href='{% if user.is_authenticated  %}{% url 'vote' %}{% else %}{% url 'login' %}{% endif %}' id='story-vote-{{ story.id }}' class='vote'><img src='{{ STATIC_URL }}images/arrow.gif'></a>

也许它并不理想,因为它不像您的第一个建议那样可读。

但是,由于您的视图中已经有 url,您可以在视图中设置链接并将其传递给您的控制器。示例视图逻辑:

link = 'login'
if user.is_authenticated:  link = 'vote'

在你的控制器中:

<a href='{{ link }}' id='story-vote-{{ story.id }}' class='vote'><img src='{{ STATIC_URL }}images/arrow.gif'></a>
于 2013-10-12T08:22:07.670 回答
1

是的,您link作为参数传递给模板。应用于模板的变量就是所谓的上下文。

真正的 django 方式是尽可能将逻辑与表示分离。这就是为什么模板可以有 if 和 for 循环,但当然应该避免变量。

于 2013-10-12T08:10:01.257 回答