在Django中管理复杂查询字符串的DRY方法是什么?

时间:2018-10-06 05:56:17

标签: django django-templates

在我的django项目中,我有两个选项使用查询字符串来定义要获取的一种列表,例如:

<a href="{% url 'index' %}?list=shopping">Shopping</a>
<a href="{% url 'index' %}?list=chores">Chores</a>

最重要的是,我还想检查用户选择了哪个列表,并使其在UI中显示为粗体。所以

{% if 'shopping' in request.GET.list or not request.GET.list %}
    <b><a href="{% url 'index' %}?list=shopping">Shopping</a></b>
    <a href="{% url 'index' %}?list=chores">Chores</a>
{% elif 'chores' in request.GET.list %}
    <a href="{% url 'index' %}?list=shopping">Shopping</a>
    <b><a href="{% url 'index' %}?list=chores">Chores</a></b>
{% endif %}

除了ShoppingChores之外,现在真正让我感到困惑的是,我还希望有两个子选项来定义列表的顺序。例如NewOld。在我看来,唯一的方法就是重复所有代码。

{% if 'new' in request.GET.list %}
    {% if 'shopping' in request.GET.list or not request.GET.list %}
        <b><a href="{% url 'index' %}?list=shopping&order=new">Shopping</a></b>
        <a href="{% url 'index' %}?list=chores&order=new">Chores</a>
        <b><a href="{% url 'index' %}?list=shopping&order=new">New</a></b>
        <a href="{% url 'index' %}?list=shopping&order=old">Old</a>
    {% elif 'chores' in request.GET.list %}
        <a href="{% url 'index' %}?list=shopping&order=new">Shopping</a>
        <b><a href="{% url 'index' %}?list=chores&order=new">Chores</a></b>
        <b><a href="{% url 'index' %}?list=chores&order=new">New</a></b>
        <a href="{% url 'index' %}?list=chores&order=old">Old</a>
    {% endif %}
{% elif 'old' in request.GET.list %}
    {# ... #}
{% endif %}

我想您已经知道这变得多么疯狂,并且对于Old if语句仍然需要做同样的事情。我真的不知道该怎么做,因为我看不到任何其他方式(1)知道应该是粗体而不是粗体。并且(2)知道每个选项应该以{{1​​}}还是?开头。

2 个答案:

答案 0 :(得分:1)

关于第一个具有粗体选择值的问题,例如,通过使用HTML类,您可以执行以下操作。

在您的css文件(或html文件中的样式块)中:

.selected {font-weight: bold;}

所以您的html现在可以变成类似的东西了,

<a class="{% if 'shopping' in request.GET.list or not request.GET.list %} selected{% endif %}" href="{% url 'index' %}?list=shopping">Shopping</a>
<a class="{% if 'chores' in request.GET.list %}selected{% endif %}" href="{% url 'index' %}?list=chores">Chores</a>

这样,您不必为每种情况编写两次或更多的html。

对于第二个问题,如果您在网址或html中使用“新”和“旧”,则可以执行以下操作,

{% with 'new old bla' as list %}
    {% for option in list.split %}
       <a class="{% if 'shopping' in request.GET.list or not request.GET.list %} selected{% endif %}" href="{% url 'index' %}?list=shopping&option={{ option }}">Shopping</a>
       <a class="{% if 'chores' in request.GET.list %}selected{% endif %}" href="{% url 'index' %}?list=chores&option={{ option }}">Chores</a>

    {% endfor %}
{% endwith %}

那只是您如何使用它的一个示例,但这将节省大量代码编写。

希望这会有所帮助!

答案 1 :(得分:1)

您可以使用QueryDict作为查询字符串。这就是Django内部使用的方式。

https://docs.djangoproject.com/en/2.1/ref/request-response/#django.http.QueryDict

但实际上,我会考虑重构您的代码。将路由逻辑放在urls.py中,将业务逻辑放在视图函数中。尝试使模板文件尽可能简单。

例如,您可以使用常规网址/?list=shopping代替/list/shopping/