【问题标题】:Django: Can't use session vars in ModelFormDjango:不能在 ModelForm 中使用会话变量
【发布时间】:2019-02-14 07:30:48
【问题描述】:

我有这个会话变量:

empresa=request.session['codEmp']

我有一个带有 ModelChoiceField 的 ModelForm:

class AuxiForm(forms.ModelForm):
    tipAux = forms.ModelChoiceField(queryset=TipoAux.objects.all(), empty_label=None,
                                    required=True, to_field_name='codigo')

如果您看到 tipAux 的查询集,它当前正在调用 all TipoAux 对象,但我真的需要做一个 过滤器,只调用 @ 987654325@ 对象具有与用户在其codEmp 会话变量中具有相同的empresa 属性。

我尝试过这样做:

tipAux = forms.ModelChoiceField(queryset=TipoAux.objects.filter(empresa=request.session['codEmp']),
                                empty_label=None, required=True,
                                to_field_name='codigo')

但是 Django 不允许我在表单中使用request.session

有什么方法可以处理吗?

【问题讨论】:

    标签: python django session


    【解决方案1】:

    尝试覆盖表单的__init__() 方法并将会话变量作为参数传递给表单:

    class AuxiForm(forms.ModelForm):
        def __init__(filter_on, *args, **kwargs):
            super(AuxiForm, self).__init__(*args, **kwargs)
            self.fields['tipAux'] = forms.ModelChoiceField(
                queryset=TipoAux.objects.filter(empresa=filter_on), 
                empty_label=None,
                required=True, 
                to_field_name='codigo'
            )
    

    而且,在您的view.py 中,您可以这样说:form = AuxiForm(data=request.POST, filter_on=request.session['codEmp'])

    或者,您可以使用 Django 的通用 model view。如果您的表单不比您发布的表单更复杂,您只需设置queryset 属性。 (我将把阅读留给你,因为我自己只是熟悉通用视图。)

    【讨论】:

      猜你喜欢
      • 2021-08-30
      • 2014-09-20
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 2020-01-09
      • 1970-01-01
      • 2011-06-03
      • 2015-10-08
      相关资源
      最近更新 更多