2010-03-11 32 views
23

Xin chào, tôi đang tham gia django và điều này khiến tôi đau đầu. Tôi đang cố gắng để có được một biến GET đơn giản. URL là site.com/search/?q=search-termCách kiểm tra nếu request.GET var là None?

Quan điểm của tôi là: truy vấn

def search(request): 
if request.method == 'GET' and 'q' in request.GET: 
    q = request.GET.get('q', None) 
    if q is not None: 
     results = Task.objects.filter(
           Q(title__contains=q) 
           | 
           Q(description__contains=q), 
           ) 
     ...return... 
    else: 
     ... 
else: 
    ... 

tìm kiếm như: mysite.com/search/? (không q) vượt qua đầu tiên nếu đúng.

Sự cố trong các truy vấn như mysite.com/search/?q=. Họ không bị bắt bởi nếu q không phải là Không:

Vì vậy, câu trả lời ngắn gọn là Làm cách nào tôi có thể kiểm tra q == ''? (Tôi đã thử '', Không, v.v., không có kết quả.)

+0

** ** nếu q ** thay vì ** nếu q không phải là None (hoặc '') **. Bất cứ ai có một lời giải thích cho điều này? – Nacho

+2

Nói chung, bạn cần phải rất thận trọng về việc sử dụng toán tử 'is' trong Python. Bình thường, bạn muốn kiểm tra bình đẳng ('=='), không phải là kiểm tra nhận dạng ('is'). Một chuỗi các bài kiểm tra độ dài khác 0, 'True'. –

Trả lời

33

Trước tiên, hãy kiểm tra xem thông số request.GET có chứa thông số có tên q hay không. Bạn đang làm điều này đúng cách đã:

if request.method == 'GET' and 'q' in request.GET: 

Tiếp theo, kiểm tra xem giá trị của q là một trong hai None hoặc chuỗi rỗng. Để làm điều đó, bạn có thể viết điều này:

q = request.GET['q'] 
if q is not None and q != '': 
    # Do processing here 

Lưu ý rằng không cần thiết phải viết request.GET.get('q', None). Chúng tôi đã kiểm tra để đảm bảo có một khóa 'q' bên trong số request.GET dict, vì vậy chúng tôi có thể lấy trực tiếp giá trị đó. Thời gian duy nhất bạn nên sử dụng phương pháp get là nếu bạn không chắc chắn một dict có một khóa nhất định và muốn tránh tăng một ngoại lệ KeyError.

Tuy nhiên, có một giải pháp tốt hơn dựa trên các sự kiện sau đây:

  • Giá trị None đánh giá để False
  • Các chuỗi rỗng '' cũng đánh giá để False
  • Bất kỳ không có sản phẩm nào chuỗi đánh giá lại đến True.

Vì vậy, bây giờ bạn có thể viết:

q = request.GET['q'] 
if q: 
    # Do processing here 

Xem những nguồn lực khác để biết thêm chi tiết:

+0

Cảm ơn, đây là thông tin tuyệt vời. Ngoài ra, tôi cảm thấy có lỗi khi đánh dấu câu trả lời của chính mình là chính xác: D – Nacho

+0

Thử https://gist.github.com/ratskin/ca64cdec852db0374e5a180347d1badc – ratskin

1

Cảm ơn bạn đã làm rõ bằng @Ned. Tìm thấy giải thích đầy đủ here.

Về cơ bản:

'==' có thể được coi là "giá trị bình đẳng", có nghĩa là, nếu hai điều trông cùng, == phải trả lại một giá trị true. (Đối với những người có một nền tảng Java , == Python được thực sự làm một cái gì đó giống như một equals() phương pháp.)

'là' có thể được coi là 'đối tượng sắc', có nghĩa là, nếu hai mọi thứ thực sự là cùng một đối tượng.

-2
#initialize 
r = request.GET 
rg = request.GET.get 

#write simply as below 
if r.has_key('q') and rg('q') != '': 
    #process 
Các vấn đề liên quan