2012-03-06 23 views
56

tôi đang sử dụng django 1.2 và chuyển từ chế độ xem này sang chế độ xem khác bằng phương pháp đảo ngược urlresolvers.Làm cách nào để chuyển các tham số GET bằng cách sử dụng địa chỉ django urlresolvers đảo ngược

url = reverse(viewOne) 

và tôi muốn vượt qua một tham số get, ví dụ

name = 'joe'

để trong viewOne nếu tôi làm

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

tôi sẽ nhận được

joe 

làm cách nào để làm điều đó?

+4

Hãy xem [câu trả lời mà] (http://stackoverflow.com/a/5341769/301373) cung cấp một cách khá tốt đẹp để làm điều này. – sberder

+1

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

Trả lời

103

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

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

Điều này phù hợp với 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

57

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

import urllib 
from django.core.urlresolvers import reverse 

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

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

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

mà mất cùng một lập luận như reverse, nhưng cung cấp đối số từ khóa bổ sung get nơi bạn có thể đặt các thông số GET của mình trong đó làm từ điển.

+4

Lưu ý: Chức năng 'django.utils.http.urlencode' 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 ": https://docs.djangoproject.com/vi /1.10/ref/utils/#django.utils.http.urlencode –

13

Đ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' 
+0

Điểm có 'sex = male & sex = female' là gì? Tôi nghĩ rằng nó nên là '& sex [] = nữ & giới tính [] = nữ' (lưu ý thêm' [] '), là một mảng yêu cầu GET – potatoes

+1

@potatoes' '[]' 'là một quy ước PHP. –

-2

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

Trong khi cả hai câu trả lời ở đây xử lý các nhiệm vụ cần quá tốt, tôi nghĩ chỉ là một chức năng đơn giản để URLEncode một cuốn từ điển là cách linh hoạt nhất để làm điều 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('&') 
+0

Điều này không * không mã hóa từ điển - không xử lý các ký tự dành riêng cho URL (ví dụ: '#', '?') Hoặc bất kỳ loại mã hóa phần trăm nào: https://en.wikipedia.org/wiki/Percent-encoding – jamesc