Skip to main content
 首页 » 编程设计

python之Django之如何排除表单字段 View

2024年08月25日29TianFang

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

我尝试使用 this tip 之后的 is_staff 选项进行测试,但我无法让它发挥作用。我收到错误:__init__() 得到了一个意外的关键字参数“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(): 
... 
... 
... 

非常感谢谁能帮助我。

抱歉我的英语不好!

请您参考如下方法:

你在正确的轨道上,但是你的声明 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']