我正在尝试访问表单类中的经过身份验证的用户。我玩过将请求对象从视图传递到类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())
答案 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这是一种更加清晰的方法,因为它与本地线程混在一起。