2017-07-18 50 views
0

我是python的新手,並試圖瞭解如何使動態ModelChoiceField工作。當我選擇一個對象與所有,但我試圖讓下拉反映用戶的屬性時,它工作正常。這裏是我的代碼:無法使動態python ModelChoiceField工作

Forms.py

class ViewByMake(forms.Form): 
    dropdown = forms.ModelChoiceField(queryset=Make.objects.none()) 

def __init__(self, user, *args, **kwargs): 
    user = kwargs.pop('user') 
    super(ViewByMake, self).__init__(*args, **kwargs) 
    qs = Make.objects.filter(user=user) 
    self.fields['dropdown'].queryset = qs 
    self.fields['dropdown'].widget.attrs['class'] = 'choices1' 
    self.fields['dropdown'].empty_label = '' 

Views.py

def view_bymake(request): 
form = ViewByMake(request.POST or None, user=request.user) 
if request.method == 'POST': 
    if form.is_valid(): 
     make = form.cleaned_data['dropdown'] 
     return HttpResponseRedirect(make.get_absolute_url1()) 
return render(request,'make/view_make.html',{'form':form}) 

此代碼工作正常,如果我刪除所有用戶=引用,但隨後只返回完整的使對象列表,它不是我想要的。我發現在計算器上一個非常類似的問題,但是當我重複相同的代碼,但它仍然不工作,這是給我下面的錯誤:

初始化()得到了論據「用戶」多個值

我在這個主題上搜索了互聯網的結尾。如果我接近這一點,我很樂意接受其他想法。我試圖基於與用戶配置文件相關的條件來獲取過濾列表。我肯定需要基於配置文件設置的下拉字段是特定於用戶的。感謝您的幫助提前。我正在運行django 1.11.2和Python 3.6.1。

這是更新的模型這就需要包括我不知道,我必須指定用戶屬性:

class Make(models.Model): 
     name = models.CharField(max_length=264,unique=True) 
     user = models.ForeignKey(User,null=True,on_delete=models.CASCADE) 
+0

你可以在init defionition中刪除用戶參數並重試嗎?我認爲你有兩次用戶在呼叫:首先它會得到用戶= request.Post,然後用戶= request.user –

+0

@NeErAj KuMaR我試過你的建議,我收到以下錯誤:不能解析關鍵字'用戶'到字段。 –

+0

@ ger.s.brett我在發佈之前嘗試過,但又試過並得到無法將關鍵字'user'解析爲字段。 –

回答

0

對我原來的問題的答案,我如何獲得用戶=用戶工作包括確保您的窗體,視圖和模型的所有引用用戶。我最初在視圖中有用戶引用和正確的形式,但我忽略了確保user =在我引用的模型上指定。我認爲它是內置的,但事實證明你必須在你的模型上專門引用它。我是新手,所以這是一次學習體驗。接下來的挑戰!

0

嘗試用要求,從形式發送請求,並在初始化 get請求形式的方法

views.py

def view_bymake(request): 
    form = ViewByMake(request.POST or None, request=request) 

forms.py

def __init__(self, user, *args, **kwargs): 
    self.request = kwargs.pop('request', None) 
    super(ViewByMake, self).__init__(*args, **kwargs) 
    qs = Make.objects.filter(user=self.request.user) 
    self.fields['dropdown'].queryset = qs 
    self.fields['dropdown'].widget.attrs['class'] = 'choices1' 
    self.fields['dropdown'].empty_label = ''