Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 在视图之外访问经过身份验证的用户_Django - Fatal编程技术网

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

Django 在视图之外访问经过身份验证的用户,django,Django,我正在尝试访问表单类中经过身份验证的用户。我尝试将请求对象从视图传递到类init,但它看起来很草率。是否有更好的方法来访问视图之外的经过身份验证的用户或请求对象 class LicenseForm(forms.Form): '''def __init__(self, *args, **kwargs): #self.fields['license'] = forms.ModelChoiceField(queryset=self.license_queryset(), empty_l

我正在尝试访问表单类中经过身份验证的用户。我尝试将请求对象从视图传递到类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())

是的,您可以这样做,以下是说明:

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

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

更新: 你可以这样做:

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

我认为这是一种更干净的处理本地线程的方法。

我编辑了我的原始帖子,以显示我正在使用的代码。因此,在license_queryset方法中,我想根据已验证的用户关联添加一些额外的过滤器。注释掉的init就是我要从视图中接受请求对象的地方。没错,这看起来更干净。我感谢所有的帮助。我之前也使用过同样的代码方法,但一直遇到在license_queryset中访问self的问题。我必须在init中动态创建licenses表单字段才能绕过它。有没有办法使license_queryset具有自作用域,并且仍然能够从许可证表单声明中调用它?抱歉,如果这些是新问题。刚刚开始学习django和python:)@CrashRoX:你说得对,我忘了重要的一点。换了。定义类方法时,您必须至少提供一个参数(为了方便起见,称为
self
)。稍后,当您调用该函数时,您不必传递它,它会自动完成。这可能会帮助你进入它:不要认为你能做到。。。您将得到“license_queryset()正好接受一个参数”。然后,如果执行self.license_queryset(),您将得到“名称‘self’未定义”。有趣的东西!您是对的,您只能在
\uuuu init\uuu
方法中设置它。对不起(这里太晚了;))。但即使是这样也比这根线更干净。