2013-04-19 31 views
1

我正在嘗試做相當簡單的事情。允許用戶在searchterm中輸入文本字段,然後從下拉框中選擇搜索字段。但我似乎正在得到上述錯誤。Django字段錯誤 - 無法將關鍵字'xxxx'解析爲字段

模板

<form method='post' action=''> 
<input type='text' id='searchterm'> 
<select id='searchfield'> 
    <option value='username'>Username</option> 
    <option value='status'>Status</option> 
</select> 
</form> 

查看

def existing(request): 
     if request.method == 'POST': 
       searchterm = request.POST['searchterm'] 
       searchfield = request.POST['searchfield'] 
       records = User.objects.filter(searchfield=searchterm) 
     else: 
       records = User.objects.all() 
     return render_to_response('gpon_table.html',locals()) 

模型

class User(models.Model): 
    username = models.CharField(max_length=50) 
    status = models.CharField(max_length=50) 

也許我做錯事的看法。

任何幫助非常感謝。

+0

請,張貼一個完整的回溯。 –

回答

5

我相信這個問題可能與您如何詢問User.objects來搜索數據有關。由於您試圖將動態關鍵字傳遞給過濾器,因此您可能必須將其作爲**kwargs傳遞給它,而不是直接作爲過濾器參數傳遞。我懷疑Django正在讀取「searchfield」作爲文字關鍵字字段名稱來搜索而不是讀取它的值。

此鏈接可能會提供更清晰的可能解決方案。 https://stackoverflow.com/a/659419/1011998

這裏有一個如何實現與您現有的代碼設置的動態領域的例子。

一如既往,清理和限制用戶輸入,否則惡意用戶可能能夠暴露除用於過濾的敏感數據以外的其他敏感數據(注:這並沒有被本地測試)

searchterm = request.POST.get('searchterm') 
searchfield = request.POST.get('searchfield', 'username') 

# Better to replace/populate this with form field choices 
available_fields = ['username', 'status'] 

if not searchfield in available_fields: 
    searchfield = 'username' 

kwargs = {'{0}__{1}'.format(searchfield, 'icontains'): searchterm} 
records = User.objects.filter(**kwargs) 
+1

You ** do **意識到這將允許任何惡意用戶搜索您的模型中的任何字段,遍歷關係,並可能暴露意圖爲私有的數據?請至少提到如果使用這種設置**,**驗證是必需的。 –

+0

托馬斯,所提供的代碼片段是爲了舉例說明baz00r如何通過傳遞給它的動態參數來實現kwargs。我期望從客戶端傳來的任何數據總是經過消毒,限制和驗證,這不包括在這個例子中,以避免陷入困境。感謝您在代碼不安全的情況下注意到攻擊的可能性。我會更新該片段以避免混淆。格拉西亞斯。 –

+0

感謝您更新並提高了您的答案。只是把它放在那裏,因爲使用ORM通常意味着我們期望開箱即用的安全性,驗證和消毒,而在這種情況下並不存在; ) –

相關問題