使用包含RadioSelect小部件的ModelChoiceField在ModelForm中的queryset中获取request.user

peb*_*x11 3 django django-forms modelform django-queryset django-views

我想向社区询问以下有关传递request.userquerysetin的信息ModelForm。我的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']
Run Code Online (Sandbox Code Playgroud)

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

所有我已经找到答案指代传递request.user__init__或填充goForm与筛选的选择的视图。但是,在我的情况下,似乎没有任何效果,因为我将表单子类化为返回特定的字符串,并且我正在使用RadioSelect特别需要使用querysetas作为参数的小部件(对此我不是100%肯定)。那么,如何可以通过request.useruser_choice

Ala*_*air 5

模型的选择现场文档展示如何设置在该查询集__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']
Run Code Online (Sandbox Code Playgroud)

请注意,该__init__方法现在将用户作为参数,因此请记住将其传递到在视图中实例化表单的任何位置。例如:

form = goForm(user=request.user, data=request.POST)
Run Code Online (Sandbox Code Playgroud)