Django динамические имена параметров URL - PullRequest
1 голос
/ 01 апреля 2019

В основном пытается сделать

    {%  url dynamic_url_name dynamic_parameter_name=dynamic_parameter_value %}

Попробовал простейший подход

<a href="{% url belongs_to belongs_to_url_arg=entry|getattribute:belongs_to_url_arg_value %}">{{entry}}</a>
    {% include 'mainsite/children/title_template.html' with
        the_title=title_text
        is_title_page=True
        entries_of="title"
        belongs_to="profile"
        belongs_to_url_arg="user"
        belongs_to_url_arg_value="author"
    %}

Но, к сожалению, это привело к полному отказу enter image description here

Из этого я могу сказать, что параметры не могут быть переменными контекста, поэтому я могу попытаться просто распаковать словарь, как я делал бы внутри python с чем-то вроде

{% url **{dynamic_parameter_name:dynamic_parameter_value} %}

Но я понятия не имею, возможно ли это внутри шаблонов django, и если возможно, как?


Мои URL выглядят как

re_path(r'^title/(?P<title_text>[a-zA-Z0-9-]+)/$', TitlePage.as_view(), name='title')
re_path(r'^user/(?P<user>[a-zA-Z0-9-]+)/$', ProfilePage.as_view() ,name='profile')

И я выбираю URL либопеременная контекста или тег включения, следовательно, это переменная.

{% url url_variable xxx=value %}

Теперь url_variable уже является частью django, а тег url принимает переменную в качестве первого аргумента.Но xxx не всегда одинаков, скорее он меняется в соответствии с url_variable, в данном конкретном случае;если url_variable является заголовком, я хочу, чтобы xxx было title_text, а если это профиль, я хочу, чтобы оно было user.Имя параметра хранится в belongs_to, поэтому, если бы это была обычная функция python, я мог бы просто сделать

url(url_variable, **{belongs_to: value})

, и он распаковал бы его с правильным именем параметра.Так что мне нужна какая-то эквивалентность этого в процессоре шаблонов

Ответы [ 2 ]

1 голос
/ 01 апреля 2019

Я думаю, вы слишком усложняете вещи.Вы сами не показывали свои взгляды, но я не понимаю, почему они не могли принять общеизвестный параметр - скажем, param - который выполняет конкретную работу.Таким образом, URL-адреса могут быть:

re_path(r'^title/(?P<param>[a-zA-Z0-9-]+)/$', TitlePage.as_view(), name='title')
re_path(r'^user/(?P<param>[a-zA-Z0-9-]+)/$', ProfilePage.as_view() ,name='profile')

, и теперь вы можете сделать

{% url dynamic_url_name param=dynamic_parameter_value %}
0 голосов
/ 01 апреля 2019

**kwargs специально не поддерживается в качестве параметра для тега {% url %}, но есть несколько обходных путей.

Если у вас есть путь в urlpatterns, определенный как:

path('myurl/<str:some>/<str:thing>', name='myurl')

Тогда у вас может быть filetoinclude.html:

<a href="{% url urlname some thing %}">My Url</a>

И тогда в вашем main.html:

{% include 'filetoinclude.html' with urlname='myurl' some="aaa" thing="bbb" %}

А когда вы рендерите, у вас будет что-то вроде:

<a href="localhost:8000/myurl/aaa/bbb">My Url</a>

Но, очевидно, проблема в том, что, возможно, вы захотите обратиться к конкретным параметрам URL, когда вы перевернете его.По этой причине вы можете создать тег тега, например:

from django.urls import reverse
from django import template

register = template.Library()


@register.simple_tag
def dynamic_url(urlname, **kwargs):
    return reverse(urlname, kwargs=kwargs)

, а затем в вашем filetoinclude.html вы можете сделать:

{% load url_extended %}
{% dynamic_url urlname some=some thing=thing %}

, который даст тот же URL, что и раньше.

...