如何根据Django中的用户从CreateView中删除字段?

2024-10-02 22:32:08 发布

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

我创建了一个CBV,我想删除其中的一个或多个字段,具体取决于用户。这个想法是一个工作站点,如果登录的用户是招聘人员,那么employer字段应该包括在内,否则应该排除它。在

表单.py

class JobCreationForm(forms.ModelForm):
    class Meta:
        model = Job
        # exclude = ['posted', 'provider', 'ext_id']
        fields = ('title',
                'job_desc', 
                'agency_name',
                'employer', 
                'contact_name',
                )

视图.py

^{pr2}$

当前错误是NoneType' object has no attribute '__getitem__'。在

我的问题:如何基于逻辑从表单中移除字段?我试过这些版本:

  • self.fields["employer"].delete()
  • self.fields.remove("employer")
  • del self.fields["employer"]

有什么提示吗?在


Tags: 用户namepyself表单fields人员站点
3条回答

几乎没有办法解决这个问题。在

我发现有两种不同的形式RecruiterEmployeeForm和{}可能更简洁。在

class RecruiterEmployeeForm(forms.ModelForm):
    model = Job
    fields = ('title',
              'job_desc', 
              'agency_name',
              'employer', 
              'contact_name',
    )

class EmployeeForm(forms.ModelForm):
    model = Job
    fields = ('title',
              'job_desc', 
              'agency_name',
              'contact_name',
    )

然后可以为CBV重写ger_form_class

^{pr2}$

发送额外的kwargs以使用泛型视图方法get_form_kwargs,并获得额外的kwargs重写形式的__init__,以及{}额外的kwargs。在

在表单.py在

class JobCreationForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
         user = kwargs.pop('user', None)
         super(JobCreationForm, self).__init__(*args, **kwargs)

        if Company.objects.filter(user_id = self.user).is_recruiter == False:
            self.fields.pop("employer")

    class Meta:
        model = Job
        # exclude = ['posted', 'provider', 'ext_id']
        fields = ('title', 'job_desc', 'agency_name', 'employer',  'contact_name')

在视图.py在

^{pr2}$

实现这一点(根据用户修改表单的字段)的正确方法是在表单的__init__方法上执行。但是,为了让表单访问当前用户,您需要从视图中将用户传递给它。为此,您将使用get_form_kwargs方法。因此,首先将以下方法添加到视图中:

def get_form_kwargs(self):
    kwargs = super().get_form_kwargs()
    kwargs.update({'user': self.request.user})
    return kwargs

现在,您可以将__init__添加到表单中,如下所示:

^{pr2}$

请注意,您首先初始化表单(使用super.__init__),然后可以将字段修改为您的核心内容。在

相关问题 更多 >