根据用户的profi从Django模型表单隐藏字段

2024-04-23 14:34:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个表单,它有两个字段(mail和status)。我只想在用户的配置文件不等于“tech”时隐藏status字段,这样用户就不能在这种情况下更改它的值。你知道吗

我本来想做的,但由于它抛出了我TypeError error: __init __ () got an unexpected keyword argument 'user',我仍然没有让它工作,那就是在中覆盖RequestForm的__init __ ()方法表单.py另一方面,重写get_form_kwargs ()方法以将用户传递给表单。我发布了我理解的相关代码:

视图.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

表单.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')

型号.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' *错误?根据用户的配置文件,您可以提出哪些建议来隐藏该字段?你知道吗


Tags: 用户pyselfform表单initmodelsrequest
1条回答
网友
1楼 · 发布于 2024-04-23 14:34:56

我建议在RequestUpdate中只重写get\u 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

我不知道为什么你的代码会失败,但是无论如何你可以在视图类中调整你的窗体,这样就不需要做更多的工作了。你知道吗

相关问题 更多 >