Что такое СУХОЙ способ управления сложными строками запросов в Django? - PullRequest
0 голосов
/ 06 октября 2018

В моем проекте django у меня есть две опции, которые используют строки запросов для определения вида списка, например:

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

Кроме того, я также хочу проверить, какой список был выбранпользователь и сделать его жирным шрифтом в пользовательском интерфейсе.Так что

{% 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 %}

Что меня сейчас смущает, так это дополнение к Shopping и Chores. Я также хочу иметь две подопции, которые определяют порядок списка.New и Old, например.Мне кажется, что единственный способ сделать это - еще одно дублирование всего кода.

{% 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) Известно, должен ли каждый вариант начинаться с ? или &.

Ответы [ 2 ]

0 голосов
/ 06 октября 2018

Вы можете использовать QueryDict для ваших строк запроса.Это то, что Джанго использует внутри.

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

Но на самом деле, я бы рассмотрел рефакторинг вашего кода.Поместите логику маршрутизации в ваш urls.py и бизнес-логику в функции представления.Постарайтесь, чтобы файлы шаблонов были максимально простыми.

Вместо /?list=shopping вы можете использовать обычный URL: /list/shopping/, например.

0 голосов
/ 06 октября 2018

Что касается вашей первой проблемы, связанной с выделением жирным шрифтом выбранного значения, то, используя класс 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 дважды или более для каждого случая.

КакЧто касается вашего второго вопроса, вы можете сделать что-то вроде ниже, если вы используете «новый» и «старый» в своих URL или 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 %}

Это всего лишь пример того, как вы будете использовать его, ноэто сэкономит много кода.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...