Cách xử lý request.GET với nhiều biến cho cùng một tham số trong Django


82

Trong chế độ xem Django, bạn có thể truy cập request.GET['variablename'], vì vậy trong chế độ xem của bạn, bạn có thể thực hiện một số việc như sau:

myvar = request.GET['myvar']

request.GET['myvar']Loại đối tượng thực tế là:

<class 'django.http.QueryDict'>

Bây giờ, nếu bạn muốn truyền nhiều biến có cùng tên tham số, tức là:

http://example.com/blah/?myvar=123&myvar=567

Bạn muốn một python được listtrả về cho tham số myvar, sau đó làm điều gì đó như sau:

for var in request.GET['myvar']:
    print(var)

Tuy nhiên, khi bạn thử mà bạn chỉ nhận được giá trị cuối cùng được truyền vào url, tức là trong ví dụ trên, bạn sẽ nhận được 567 và kết quả trong trình bao sẽ là:

5
6
7

Tuy nhiên, khi bạn in request.GETnó có vẻ như nó có listnghĩa là:

<QueryDict: {u'myvar': [u'123', u'567']}>

Ok Cập nhật: Nó được thiết kế để trả về giá trị cuối cùng, trường hợp sử dụng của tôi là tôi cần một danh sách.

từ tài liệu django:

QueryDict. getitem (khóa) Trả về giá trị cho khóa đã cho. Nếu khóa có nhiều hơn một giá trị, getitem () trả về giá trị cuối cùng. Tăng django.utils.datastructures.MultiValueDictKeyError nếu khóa không tồn tại. (Đây là một lớp con của KeyError tiêu chuẩn của Python, vì vậy bạn có thể bám vào việc bắt KeyError

QueryDict.getlist (key) Trả về dữ liệu có khóa được yêu cầu, dưới dạng danh sách Python. Trả về danh sách trống nếu khóa không tồn tại. Nó được đảm bảo trả về một danh sách của một số loại.

Cập nhật: Nếu có ai biết tại sao nhà phát triển django đã làm điều này, vui lòng cho tôi biết, có vẻ như phản trực quan để hiển thị một danh sách và nó không hoạt động giống như một danh sách. Không phải là trăn!


4
Tôi nghĩ lý do là bạn nên biết nên mong đợi một danh sách hay giá trị cá nhân. QueryDict.getitem đôi khi không nên trả lại một danh sách, một mục riêng lẻ - khi đó mọi người sẽ luôn phải kiểm tra kiểu trả về của nó để xử lý nó đúng cách.
jgiles

Câu trả lời:


180

Bạn muốn hàm getlist () của đối tượng GET:

request.GET.getlist('myvar')

10
Bạn có thể cần thêm "[]" vào cuối tên var nếu bạn đang sử dụng jquery để đăng lại các mục.
Danny Staple

2
Tôi biết về getlist nhưng "[]" đã khiến tôi khó chịu. Ngoài ra, tôi có một người bạn tên là Andy Staple, và trong một giây, tôi nghĩ rằng anh ấy biết về Django nhiều hơn tôi nhận ra. Điều đó cũng đã ném tôi.
kungphu

1
Điều này cần được đăng trên tất cả các tài liệu Django, tài liệu Django Rest Framework và ngược lại trên trán của tôi. Điều này thực sự bắt tôi mất cảnh giác
Anthony Manning-Franklin

Nó có vẻ như Django loại bỏ bóng trên một rằng, không chắc chắn nếu có ý định
NaturalBornCamper

1

Một giải pháp khác là tạo một bản sao của đối tượng request ... Thông thường, bạn không thể lặp qua đối tượng request.GET hoặc request.POST, nhưng bạn có thể thực hiện các thao tác như vậy trên bản sao:

res_set = request.GET.copy()
for item in res_set['myvar']:
    item
...

2
bạn có chắc không? điều này không thay đổi hành vi của QueryDict đối với tôi. tôi chỉ nhận được một QueryDict với "giới hạn" tương tự
hạt
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.