无法让动态python ModelChoiceField工作

时间:2017-07-18 13:40:57

标签: django python-3.x

我是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})

如果我删除所有user =引用但是只返回完整的make对象列表,这不是我想要的,这段代码工作正常。我在StackOverflow上发现了一个非常相似的问题,但是当我以相同方式复制代码时,它仍然不起作用,并且它给了我以下错误:

init ()为参数'user'

获取了多个值

我在这个主题上搜索了互联网的结尾。如果我接近这个问题,我会接受其他想法。我正在尝试基本上根据与用户配置文件关联的条件获取筛选列表。我肯定需要根据配置文件设置特定于用户的下拉字段。感谢您的帮助。我正在运行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)

2 个答案:

答案 0 :(得分:0)

尝试请求,从表单发送请求并以 init 方式获取请求

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 = ''

答案 1 :(得分:0)

我原来的问题的答案,我如何让user = user工作包括确保您的表单,视图和模型都是参考用户。我最初在视图中使用了用户引用并且表单正确,但我忽略了确保在我引用的模型上指定了user =。我认为它是内置的,但事实证明你必须在你的模型上专门引用它。我是新手,所以这是一次学习经历。接下来的挑战!