根据用户个人资料隐藏Django ModelForm中的字段

时间:2019-11-04 13:10:41

标签: python django

我有一个包含两个字段(邮件和状态)的表格。我只想在用户配置文件不等于“ tech”的情况下隐藏状态字段,以免用户在这种情况下无法更改其值。

我正在尝试做的事情,但是仍然无法正常工作,因为它使我TypeError error: __init __ () got an unexpected keyword argument 'user'丢了,它是要覆盖form.py中的RequestForm的__init __ ()方法覆盖get_form_kwargs ()方法以将用户传递给表单。我发布了我了解的相关代码:

views.py:

...
class RequestUpdate(UpdateView):
    model = Request
    form_class = RequestForm
    template_name = 'request/request_form.html'
    success_url = reverse_lazy('request:request_list')

    def get_form_kwargs(self):
        kwargs = super().get_form_kwargs()
        kwargs['user'] = self.request.user
        return kwargs

forms.py:

class RequestForm(forms.ModelForm):

    class Meta:
        model = Request
        fields = [
            'mail',
            'status',
        ]
        labels = {
            'mail': 'E-Mail (including @domain.example)',
            'status': "Request's status:"
        }
        widgets = {
            'mail': forms.EmailInput(attrs={'class': 'form-control'}),
        }

    def __init__(self, *args, **kwargs):
        self.user = kwargs.pop('user', None)
        super().__init__(*args, **kwargs)
        if self.user.is_tech == False:
            self.fields.pop('status')

models.py

...
class Request(models.Model):
   mail = models.CharField(max_length=50)
   states = [('1','Pending'), ('2','In process'), ('3','Done')]
   status = models.CharField(max_length=50, choices=states, default='1')
   user = models.ManyToManyField(Requester, blank=True)

为什么会发生* unexpected keyword argument 'user' *错误?您可以根据用户个人资料提出什么建议来隐藏该字段?

1 个答案:

答案 0 :(得分:0)

我建议仅按照RequestUpdate中的说明重写get_form方法:

def get_form(self, *args, **kwargs):
    form = super().get_form(self.form_class)
    if not self.request.user.status.is_tech:
        form.fields.pop('status')
    return form

我不知道您的代码为什么会失败,但是无论如何您都可以在视图类中调整表单,因此无需做更多的工作。

相关问题