Як додати параметри URL-адреси до тегу URL-адреси шаблону Django?


100

На мій погляд, щоб отримати параметри 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?




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.
Крістіан Лонг

Дивіться цю відповідь для простого тегу шаблону для відображення рядків запитів url.
Крістіан Лонг

Відповіді:


171

Спочатку потрібно підготувати свою 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

93

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

Просто додайте їх до кінця:

<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?
Аль Свейгарт,

3
Шон: Так. Якщо ви цього не хочете, використовуйте запит POST або знайдіть якийсь спосіб зворотного каналу для передачі параметрів. Передавання параметрів за URL-адресою є стандартним для запитів GET
Shayne

що передавати два аргументи?
FightWithCode

27

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

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

Використовується в django 2.0


Потім слід відредагувати запитання до певної версії 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.
Ігор Вольтайк

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 - де квиток_ід - це назва групи, а шаблон - якийсь зразок, що відповідає.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.