Как добавить параметры URL-адреса в тег URL-адреса шаблона Django?

102

На мой взгляд, чтобы получить такие параметры URL:

date=request.GET.get('date','')

В моем URL-адресе я пытаюсь передать параметры таким образом с помощью тега шаблона URL-адреса следующим образом:

<td><a href="{% url 'health:medication-record?date=01/01/2001' action='add' pk=entry.id %}" >Add To Log</a></td>

Параметр после? очевидно, не работает, как я могу передать это значение данных, чтобы получить его с помощью get?

Атма
источник
Проверьте эту ссылку .
Нагкумар Аркалгуд
Возможный дубликат. Можно ли передать параметры запроса через тег шаблона {% url%} Django?
Чиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
1
Размышляя об этом, не забудьте различать «параметры URL-адреса Django» и «параметры запроса URL-адреса». Параметры URL-адреса Django настраиваются при urls.pyиспользовании, path()например path('client/<int:id>/'). Параметры запроса URL - это часть URL-адреса после, ?например https://example.com/a/b/?param1=value1&param2=value2. Этот вопрос касается параметров URL-запроса, но некоторые ответы относятся к параметрам URL-адреса Django.
Christian Long
См. Этот ответ, чтобы узнать о простом настраиваемом теге шаблона для отображения строк запроса URL.
Christian Long

Ответы:

172

Сначала вам нужно подготовить URL-адрес для принятия параметра в регулярном выражении: (urls.py)

url(r'^panel/person/(?P<person_id>[0-9]+)$', 'apps.panel.views.person_form', name='panel_person_form'),

Итак, вы используете это в своем шаблоне:

{% url 'panel_person_form' person_id=item.id %}

Если у вас более одного параметра, вы можете изменить свое регулярное выражение и изменить шаблон, используя следующее:

{% url 'panel_person_form' person_id=item.id group_id=3 %}
Андергмартинс
источник
@MehranNouri использует request.GET вместо request.get
Cyd
1
Есть ли способ передать динамическое количество kwargs, передав словарь из контекста? например, {% url target_link target_kwargs %}это было бы похоже на переход **kwargsк функции. У меня есть вариант использования, когда target_linkэто переменная, и поэтому количество kwargs в URL-
адресе
Обратите внимание, что это не параметры запроса, этот ответ описывает параметры URL-адреса django. Это не то, о чем спрашивал OP (хотя ответ действительно описывает рабочее альтернативное решение).
BjornW
94

Я нашел ответ здесь: можно ли передать параметры запроса через тег шаблона {% url%} Django?

Просто добавьте их в конец:

<a href="{% url myview %}?office=foobar">
For Django 1.5+

<a href="{% url 'myview' %}?office=foobar">

[больше нечего улучшать, но я получаю глупую ошибку, когда исправляю отметки в коде]

Атма
источник
1
Если использовать это, информация office = foobar будет видна пользователю на панели навигации, не так ли?
Diansheng
1
Разве это не приводит к тому, что завершающая косая черта не прерывает URL-адрес, например, example.com/myview/?office=foobarвместо example.com/myview?office=foobar?
Al Sweigart
3
Шон: Да. Если вам это не нужно, используйте запрос POST или найдите способ передачи параметров через обратный канал. Передача параметров в URL-адрес стандартна для запросов GET
Шейн
что передать два аргумента?
FightWithCode
28

Просто добавьте URL-адрес шаблонов:

<a href="{% url 'service_data' d.id %}">
 ...XYZ
</a>

Используется в django 2.0

Г-н Сингх
источник
@ScottSkiles Затем вам следует отредактировать вопрос для конкретной версии Django, а затем добавить еще один, чтобы охватить более свежую версию. Некоторые скажут, что это дублирование, но я не согласен. Несколько версий в одном вопросе могут ввести в заблуждение.
Бернардо Дуарте,
17

Это можно сделать в три простых шага:

1) Добавьте идентификатор товара с urlтегом:

{% for item in post %}
<tr>
  <th>{{ item.id }}</th>
  <td>{{ item.title }}</td>
  <td>{{ item.body }}</td>
  <td>
    <a href={% url 'edit' id=item.id %}>Edit</a>
    <a href={% url 'delete' id=item.id %}>Delete</a>
  </td>
</tr>
{% endfor %}

2) Добавьте путь к urls.py :

path('edit/<int:id>', views.edit, name='edit')
path('delete/<int:id>', views.delete, name='delete')

3) Используйте идентификатор в views.py :

def delete(request, id):
    obj = post.objects.get(id=id)
    obj.delete()

    return redirect('dashboard')
Нирадж Сингх Чохан
источник
введите свой код вместо добавления снимка экрана, чтобы избежать голосов против.
Вайбхав Вишал
Именно то, что я искал в документации Django.
Igor Voltaic
10

Я не уверен, что я не в теме, но я нашел решение для себя; У вас есть представление на основе классов, и вы хотите иметь параметр get в качестве тега шаблона:

class MyView(DetailView):
    model = MyModel

    def get_context_data(self, **kwargs):
        ctx = super().get_context_data(**kwargs)
        ctx['tag_name'] = self.request.GET.get('get_parameter_name', None)
        return ctx

Затем вы делаете запрос на получение /mysite/urlname?get_parameter_name='stuff.

В вашем шаблоне, когда вы вставляете {{ tag_name }}, у вас будет доступ к значению параметра get ('stuff'). Если в вашем шаблоне есть URL-адрес, которому также нужен этот параметр, вы можете сделать

 {% url 'my_url' %}?get_parameter_name={{ tag_name }}"

Вам не нужно будет изменять конфигурацию URL-адреса

Гийом Лебретон
источник
5

1: HTML

           <tbody>
            {% for ticket in tickets %}
              <tr>
                <td class="ticket_id">{{ticket.id}}</td>
                <td class="ticket_eam">{{ticket.eam}}</td>
                <td class="ticket_subject">{{ticket.subject}}</td>
                <td>{{ticket.zone}}</td>
                <td>{{ticket.plaza}}</td>
                <td>{{ticket.lane}}</td>
                <td>{{ticket.uptime}}</td>
                <td>{{ticket.downtime}}</td>
                <td><a href="{% url 'ticket_details' ticket_id=ticket.id %}"><button data-toggle="modal" data-target="#modaldemo3" class="value-modal"><i class="icon ion-edit"></a></i></button> <button><i class="fa fa-eye-slash"></i></button>
              </tr>
            {% endfor %}
            </tbody>

{% Url 'ticket_details'%} - это имя функции в ваших представлениях.

2: Views.py

def ticket_details(request, ticket_id):

   print(ticket_id)
   return render(request, ticket.html)

ticket_id - это параметр, который вы получите из ticket_id = ticket.id

3: URL.py

urlpatterns = [
path('ticket_details/?P<int:ticket_id>/', views.ticket_details, name="ticket_details") ]

/? P - где ticket_id - это имя группы, а шаблон - это какой-то шаблон для сопоставления.

Cyd
источник