gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 20:59:28 24 4
gpt4 key购买 nike

我创建了一个 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',
)

views.py

class JobCreateView(LoginRequiredMixin, CreateView): 
template_name = 'job/job.html'
form_class = JobCreationForm
success_url = '/'

def get_context_data(self, **kwargs):
context = super(JobCreateView, self).get_context_data(**kwargs)
# import the Customers of this Company
self.fields["agency_name"].remove()
recruiter = self.request.user
self.fields["contact_name"].queryset = Profile.objects.filter(user_id = self.request.user)
# if the user is a recruiter, delete the employer field.
if Company.objects.filter(user_id = self.request.user).values('is_recruiter') == False:
pass
# self.fields.remove("employer")
del self.fields["employer"]
return context

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

我的问题:如何根据逻辑从表单中删除一个字段?我试过这些版本:

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

有什么建议吗?

最佳答案

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

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

现在,您可以像这样向您的表单添加一个 __init__:

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

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

请注意,您首先初始化表单(使用 super.__init__),然后您可以根据自己的喜好修改字段。

关于python - 如何根据 Django 中的用户从 CreateView 中删除字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49535336/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com