Làm cách nào để thêm thông số url vào thẻ url mẫu Django?


100

Theo quan điểm của tôi để nhận các thông số url như thế này:

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

Trong url của tôi, tôi đang cố gắng chuyển các tham số theo cách này với thẻ mẫu url như sau:

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

Tham số sau dấu? rõ ràng là không hoạt động, làm cách nào tôi có thể chuyển giá trị dữ liệu này để truy xuất bằng get?


Kiểm tra liên kết này .
Nagkumar Arkalgud


1
Khi nghĩ về điều này, hãy đảm bảo phân biệt giữa "tham số url Django" và "tham số truy vấn url". Các tham số url Django được định cấu hình urls.pybằng cách sử dụng path()vd path('client/<int:id>/'). Tham số truy vấn URL là một phần của url sau ?ví dụ https://example.com/a/b/?param1=value1&param2=value2. Câu hỏi này là về các tham số truy vấn url, nhưng một số câu trả lời đề cập đến các tham số url Django.
Christian Long

Xem câu trả lời này để biết thẻ mẫu tùy chỉnh đơn giản để hiển thị các chuỗi truy vấn url.
Christian Long

Câu trả lời:


170

Trước tiên, bạn cần chuẩn bị url của mình để chấp nhận tham số trong regex: (urls.py)

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

Vì vậy, bạn sử dụng cái này trong mẫu của mình:

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

Nếu bạn có nhiều hơn một tham số, bạn có thể thay đổi regex của mình và sửa đổi mẫu bằng cách sử dụng như sau:

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

@MehranNouri sử dụng request.GET thay vì request.get
Cyd

1
Có cách nào để chuyển một số kwargs động bằng cách chuyển từ điển từ ngữ cảnh không? ví dụ: {% url target_link target_kwargs %}nó sẽ giống như tương đương với việc truyền **kwargstới một hàm. Tôi có một trường hợp sử dụng target_linkcó biến và do đó số lượng kwargs trong url không được biết
teebagz

Lưu ý rằng đây không phải là các tham số truy vấn, câu trả lời này đang mô tả các tham số url django. Đây không phải là những gì OP hỏi về (mặc dù câu trả lời mô tả một giải pháp thay thế hoạt động).
BjornW

92

Tôi đã tìm thấy câu trả lời ở đây: Có thể chuyển các tham số truy vấn qua thẻ mẫu {% url%} của Django không?

Chỉ cần thêm chúng vào cuối:

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

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

[không có gì khác để cải thiện nhưng tôi đang gặp một lỗi ngu ngốc khi sửa lỗi mã]


1
Nếu sử dụng điều này, thông tin 'office = foobar' sẽ được hiển thị cho người dùng trên thanh điều hướng, phải không?
Diansheng

1
Điều này không dẫn đến việc dấu gạch chéo ở cuối làm gián đoạn url, như example.com/myview/?office=foobarthay vì example.com/myview?office=foobar?
Al Sweigart

2
Sean: Vâng. Nếu bạn không muốn điều này, hãy sử dụng yêu cầu ĐĂNG hoặc tìm một số cách kênh ngược để vượt qua các thông số. Đi qua params trên URL là tiêu chuẩn cho các yêu cầu GET
Shayne

cái gì truyền hai đối số?
FightWithCode

27

Chỉ cần thêm URL mẫu:

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

Được sử dụng trong django 2.0


@ScottSkiles Sau đó, bạn nên chỉnh sửa câu hỏi thành một phiên bản Django cụ thể và sau đó thêm một câu hỏi khác để bao gồm một phiên bản mới hơn. Một số người sẽ nói rằng đó là một bản sao, nhưng tôi không đồng ý. Nhiều phiên bản trong một câu hỏi có thể gây hiểu lầm.
Bernardo Duarte

17

Điều này có thể được thực hiện trong ba bước đơn giản:

1) Thêm id mặt hàng với urlthẻ:

{% 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) Thêm đường dẫn đến urls.py :

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

3) Sử dụng id trên views.py :

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

    return redirect('dashboard')

nhập mã của bạn thay vì thêm ảnh chụp màn hình để tránh phản đối.
Vaibhav Vishal

Điều chính xác mà tôi đang tìm kiếm trong tài liệu Django.
Igor Voltaic

10

Tôi không chắc liệu tôi có ra khỏi chủ đề hay không, nhưng tôi đã tìm thấy giải pháp cho mình; Bạn có chế độ xem dựa trên lớp và bạn muốn có tham số get làm thẻ mẫu:

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

Sau đó, bạn thực hiện yêu cầu nhận của bạn /mysite/urlname?get_parameter_name='stuff.

Trong mẫu của bạn, khi bạn chèn {{ tag_name }}, bạn sẽ có quyền truy cập vào giá trị tham số get ('thứ'). Nếu bạn có một url trong mẫu của mình cũng cần tham số này, bạn có thể làm

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

Bạn sẽ không phải sửa đổi cấu hình url của mình


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'%} là tên hàm trong chế độ xem của bạn

2: Views.py

def ticket_details(request, ticket_id):

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

ticket_id là tham số bạn sẽ nhận được từ ticket_id = ticket.id

3: URL.py

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

/? P - trong đó ticket_id là tên của nhóm và mẫu là một số mẫu phù hợp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.