在视图外部访问经过身份验证的用户

时间:2010-02-05 01:20:00

标签: django

我正在尝试访问表单类中的经过身份验证的用户。我玩过将请求对象从视图传递到类init,但它看起来很草率。有没有更好的方法来访问视图外的经过身份验证的用户或请求对象?

class LicenseForm(forms.Form):
    '''def __init__(self, *args, **kwargs):
    #self.fields['license'] = forms.ModelChoiceField(queryset=self.license_queryset(), empty_label='None', widget=forms.RadioSelect())'''

    def license_queryset():
        queryset = License.objects.filter(organization__isnull=True)
        # add addtional filters if the logged in user belongs to an organization
        return queryset

    licenses = forms.ModelChoiceField(queryset=license_queryset(), empty_label='None', widget=forms.RadioSelect())

1 个答案:

答案 0 :(得分:2)

是的,你可以这样做,这里有说明:http://code.djangoproject.com/wiki/CookBookThreadlocalsAndUser

虽然这有效,但我个人更愿意将用户传递给视图中的表单。这感觉不像是黑客。

你也可以展示你的代码,也许它可以改进。为什么你必须在表单中访问用户?

<强>更新 你可以这样做:

class LicenseForm(forms.Form):
    def __init__(self, *args, **kwargs):
        super(LicenseForm, self).__init__(*args, **kwargs)
        self._user = kwargs.get('user',None)
        self.fields['licenses'] = forms.ModelChoiceField(queryset=self.license_queryset(), empty_label='None', widget=forms.RadioSelect())

    def license_queryset(self):
        queryset = License.objects.filter(organization__isnull=True)
        if self._user and self._user.belongsTo('SomeOrganization'):
            queryset  = queryset.filter(whatever='fits')
        return queryset

Imho这是一种更加清晰的方法,因为它与本地线程混在一起。