Làm cách nào để chuyển các tham số GET bằng cách sử dụng đảo ngược urlresolvers django


81

Tôi đang sử dụng django 1.2 và đi từ chế độ xem này sang chế độ xem khác bằng phương pháp đảo ngược urlresolvers.

url = reverse(viewOne)

và tôi muốn chuyển một tham số get, chẳng hạn

name = 'joe'

để trong chế độ xemOne if I do

def viewOne(request):
    request.GET['name']

tôi sẽ nhận

joe

Làm thế nào để làm điều đó ?


4
Hãy xem câu trả lời đó đưa ra một cách khá hay để thực hiện loại việc này.
sberder

1
Tôi tạo ra một yêu cầu tính năng: code.djangoproject.com/ticket/25582
guettli

Câu trả lời:


149

Tham số GET không liên quan gì đến URL được trả về reverse. Chỉ cần thêm nó vào cuối:

url = "%s?name=joe" % reverse(viewOne)

8
Điều này hoạt động cho ví dụ này. Vì không có trích dẫn nào được thực hiện, điều này không thành công nếu bạn sử dụng các giá trị cần được trích dẫn.
guettli

75

Một cách an toàn và linh hoạt hơn:

import urllib
from django.urls import reverse


def build_url(*args, **kwargs):
    get = kwargs.pop('get', {})
    url = reverse(*args, **kwargs)
    if get:
        url += '?' + urllib.urlencode(get)
    return url

thì bạn có thể sử dụng build_url:

url = build_url('view-name', get={'name': 'joe'})

lấy các đối số giống như reverse, nhưng cung cấp một đối số từ khóa bổ sung get, nơi bạn có thể đặt các GETtham số của mình vào đó như một từ điển.


12
Lưu ý: django.utils.http.urlencodeHàm của Django có thể thích hợp hơn vì nó là "phiên bản của hàm urllib.urlencode () của Python có thể hoạt động trên chuỗi unicode": docs.djangoproject.com/en/1.10/ref/utils/…
Dolan Antenucci

17

Điều này rất giống với giải pháp của Amir nhưng cũng xử lý danh sách.

from django.core.urlresolvers import reverse
from django.http import QueryDict

def build_url(*args, **kwargs):
    params = kwargs.pop('params', {})
    url = reverse(*args, **kwargs)
    if not params: return url

    qdict = QueryDict('', mutable=True)
    for k, v in params.iteritems():
        if type(v) is list: qdict.setlist(k, v)
        else: qdict[k] = v

    return url + '?' + qdict.urlencode()

Ví dụ sử dụng:

>>> build_url('member-list', params={'format': 'html', 'sex': ['male', 'female']})
u'/members/?format=html&sex=male&sex=female'

Có ích lợi gì sex=male&sex=female? Tôi nghĩ nó nên là &sex[]=female&sex[]=female(lưu ý phần bổ sung []), là một mảng yêu cầu GET
motatoes

3
@potatoes Đây []là một quy ước PHP.
Jonas Schäfer

-2

Xin lỗi vì sự điều chỉnh chậm trễ này.

Mặc dù cả hai câu trả lời ở đây đều xử lý quá tốt nhiệm vụ được yêu cầu, nhưng tôi nghĩ chỉ một hàm đơn giản để mã hóa một từ điển là cách linh hoạt nhất để thực hiện việc này:

import urllib

def getify(dic):
    st = ''
    for K, V in dic.items():
        K = urllib.parse.quote(str(K))
        if isinstance(V, list):
            for v in V:
                st += K + '=' + urllib.parse.quote(str(v)) + '&'
        else:
            st += K + '=' + urllib.parse.quote(str(V)) + '&'
    return st.rstrip('&')

1
Điều này không URLEncode điển - không có xử lý URL reserved ký tự (ví dụ #, ?) hoặc bất kỳ loại mã hóa phần trăm: en.wikipedia.org/wiki/Percent-encoding
jamesc
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.