Django - 如何排除表单字段视图?

Posted

技术标签:

【中文标题】Django - 如何排除表单字段视图?【英文标题】:Django - how to exclude a form field view? 【发布时间】:2015-11-03 03:14:24 【问题描述】:

如果用户具有特定属性,我无法排除字段。

我尝试使用this tip 之后的is_staff 选项进行测试,但我无法使其工作。我得到错误:__init__() got an unexpected keyword argument 'user'

如果用户是员工,谁能告诉我如何排除某些字段?

这是我在 forms.py 中的表单

class NewOrderForm(forms.ModelForm):

    class Meta:
        model = WorkOrder
        fields = ['store_internal_order',
                  'sector',
                  'article',
                  'serial',
                  'work',
                  'article_details',
                  'cash_advance',
                  'initial_price'
                  ]

    def __init__(self, *args, **kwargs):
        super(NewOrderForm, self).__init__(*args, **kwargs)
        user = kwargs.pop('user')
        if user.is_staff:
           del self.fields['store_internal_order']

这是我的观点

def new(request):
    if not request.user.is_authenticated():
        return redirect('auth_login')

    title = "Nueva Orden de trabajo"
    store = request.user.userprofile.fk_store
    form = NewOrderForm(request.POST or None)
    context = "title": title,
               "form": form

    if 'dni_cuit' in request.session:
        dni_cuit = request.session.get('dni_cuit')
        if Client.objects.get(dni_cuit=dni_cuit):
            dni_cuit = request.session.pop('dni_cuit')
            client = Client.objects.get(dni_cuit=dni_cuit)

            context.update('client': client)
            request.session['dni_cuit'] = dni_cuit
        else:
            return redirect('new_client')

    # Si el formulario es valido guardamos el contenido
    if form.is_valid():
...
...
...

非常感谢谁能帮助我。

对不起,我的英语不好!

【问题讨论】:

【参考方案1】:

您在正确的轨道上,但您的声明 user = kwargs.pop('user') 处于错误的位置。它应该在super(NewOrderForm, self).__init__(*args, **kwargs) 之前调用。发生此错误的原因是因为在基表单类中,__init__() 方法不希望接受您的 user 参数。因此,我们需要先弹出它并将其存储在一个变量中,然后调用super

修正后:

class NewOrderForm(forms.ModelForm):

    class Meta:
        model = WorkOrder
        fields = ['store_internal_order',
                  'sector',
                  'article',
                  'serial',
                  'work',
                  'article_details',
                  'cash_advance',
                  'initial_price'
                  ]

    def __init__(self, *args, **kwargs):
        # user should be popped here
        user = kwargs.pop('user', None)
        super(NewOrderForm, self).__init__(*args, **kwargs)
        # just in case your user is empty
        if user and user.is_staff:
           del self.fields['store_internal_order']

【讨论】:

【参考方案2】:

不确定这是否有帮助,但 user = kwargs.pop('user') 应该是 user = kwargs.pop('user', None) 吗?您是否还尝试将user=request.user 作为NewOrderForm 中的参数传递?

【讨论】:

以上是关于Django - 如何排除表单字段视图?的主要内容,如果未能解决你的问题,请参考以下文章

django modelformset 排除 ID 字段

Django admin 不同的内联用于更改和添加视图

使用请求对象访问 django 视图中的 html 表单字段

在 django 视图中将表单字段作为属性访问

如何在 django 注册表单中添加额外的字段?

Django 表单:查询结果定义的字段,单个视图同时更新多个对象