2017-08-03 36 views
2

我有類似於www.example.com/search?param1=abc&param2=xyz&param3=的URL,目前我在視圖中做的是這樣的。如何在django中跳過空獲取參數

if ((request.GET.get('param1')) or (request.GET.get('param2')) or (request.GET.get('param3'))): 
    if request.GET.get('param1'): 
     value1 = request.GET.get('param1') 
    if request.GET.get('title'): 
     value2 = request.GET.get('param2') 
    if request.GET.get('location'): 
     value3 = request.GET.get('param3') 

api_url = `www.api-end-point.com?p1=value1&p2=value2&p3=value3&format=json` 

但是你們可以看到param3是空的,並且要打api我需要跳過空的參數。

所以我的問題是我怎麼能從django中的GET請求中的url中獲取所有設置參數。

+0

你嘗試使用默認參數,如果沒有通過呢? – Gahan

+0

@Gahan我不明白你的意思,實際上這是我的第一個項目,我還沒有聽說過默認參數 – parvez

回答

2

試試這個:

# values = [request.GET.get(p) for p in ['param1', 'param2', 'param3']] 
values = ['val1', 'val2', ''] 
names = ['p1', 'p2', 'p3'] 
query = 'www.api-end-point.com?' 

for i, value in enumerate([v for v in values if v]): 
    query += "{}{}={}".format("&" if i else "", names[i], value) 

query += '&format=json' 

這將產生:

www.api-end-point.com?p1=val1&p2=val2&format=json

+0

完美的解決方案,它的工作 – parvez

1

你可以試試:

value1 = request.GET.get('param1') if request.GET.get('param1') else None

+0

你不覺得它幾乎相同嗎?if request.GET.get('param1' ): value1 = request.GET.get('param1') else value1 = None' – parvez

+0

不,它總是在您的case變量中創建變量而不是定義。 –

+0

這並不能解決'&'s和冗餘'p1 ='s不一致的問題。 – Siegmeyer

1

確定這只是讓我抓狂,如果你想一個非常骯髒但工作的解決方案檢查代碼:

def index2 (request): 
if ....: 
    try: 
     value1,value2,value3 = request.GET.get('param1'),request.GET.get('param2'),request.GET.get('param3') 
    except: 
     value1,value2,value3 = None, None, None 
if value3: 
    api_url = "www.api-end-point.com?p1="+str(value1)+"&p2="+str(value2)+"&p3="+str(value3)+"&format=json" 
elif value2: 
    api_url = "www.api-end-point.com?p1="+str(value1)+"&p2="+str(value2)+"&format=json" 
elif value1: 
    api_url = "www.api-end-point.com?p1="+str(value1)+"&format=json" 
else: 
    api_url = "Whatever/redirect" 
return render(request,'someThing/index.html',{"api_url":api_url}) 

不推薦用於生產,因爲它根本不乾淨。與其他人發佈for循環的解決方案更清潔!但這個正在運行....

它是一個快速和骯髒的解決方案,但這個工程。我嘗試過這個。如果你有任何問題發表評論:)

+0

@parvez我做了一個編輯。請告訴我,如果這個工程。因爲它沒有像我期望的那樣運行,我只是有點生氣。 – hansTheFranz

+0

它的工作原理,但不認爲這是這種問題的非常幼稚的解決方案嗎?我正在尋找一些其他的替代 – parvez

+0

是的,我認爲這就是爲什麼我寫了三次它不好。但是我很高興我能使它工作,我越來越瘋狂,然後我寫越來越多的線條來製造「某種東西」......如果你把我的解決方案和其他的東西結合起來,你最終可能會得到一個合適的解決方案;) – hansTheFranz

0

嘗試使用的urllib和地圖字典爲eaxample:

import urllib 

get_params = {'params1':'p1', 'params2':'p2', 'params3':'p3'} 
query_params = {'format': 'json'} 
for param in get_params: 
    value = request.GET.get(param) if request.GET.get(param) else None 
    if value: 
     query_params[get_paramas.get(param)] = value 

query = urllib.urlencode(query_params) 

api_url = "www.api-end-point.com?%s" % query 
0
params = {k: request.GET[k] for k in request.GET if request.GET[k]}