代码之家  ›  专栏  ›  技术社区  ›  pebox11

获取请求。具有ModelChoiceField的ModelForm中的queryset中的用户,该ModelChoiceField包含RadioSelect小部件

  •  6
  • pebox11  · 技术社区  · 11 年前

    我想向社区询问以下关于通过 request.user queryset 在里面 ModelForm 我的 模型窗体 是:

    class goForm(ModelForm): 
        user_choice = goModelChoiceField(
                widget=forms.RadioSelect,
                queryset=Document.objects.all().filter(who_upload=request.user),
                empty_label=None,
                to_field_name='docfile',
                label = 'Please select'
                )            
        class Meta:
            model = go
            fields = ['user_choice']
    

    具有

    class goModelChoiceField(forms.ModelChoiceField):
            def label_from_instance(self, obj):
                return  "'%s' uploaded on %s" % (obj.file_name, 
                    obj.when_upload.date()) 
    

    我找到的所有答案都是指通过 请求用户 __init__ 或填充 goForm 在视图中使用过滤的选择。然而,在我的情况下似乎没有任何作用,因为我已经对表单进行了子分类以返回特定字符串,并且我正在使用 这个 RadioSelect 专门需要 查询集 作为一个论点(我对此没有100%的把握)。那我怎么才能通过 请求用户 在里面 user_choice ?

    1 回复  |  直到 11 年前
        1
  •  9
  •   Alasdair    11 年前

    这个 model choice field docs 显示如何在 __init__ 方法

    class goForm(ModelForm): 
        user_choice = goModelChoiceField(
            widget=forms.RadioSelect,
            queryset=None,
            empty_label=None,
            to_field_name='docfile',
            label = 'Please select'
            )            
    
        def __init__(self, user, *args, **kwargs):
            super(goForm, self).__init__(*args, **kwargs)
            self.fields['user_choice'].queryset = Document.objects.all().filter(who_upload=user)
    
        class Meta:
            model = go
            fields = ['user_choice']
    

    注意 __初始化__ 方法现在将用户作为参数,所以请记住在视图中实例化表单的任何位置传递它。例如:

    form = goForm(user=request.user, data=request.POST)