Python 在基于Django类的视图中根据条件获取不同的表单
假设我有如下表格:Python 在基于Django类的视图中根据条件获取不同的表单,python,django,django-forms,django-views,django-class-based-views,Python,Django,Django Forms,Django Views,Django Class Based Views,假设我有如下表格: class FormA(models.ModelForm): ... class FormB(models.ModelForm): .... class FormC(models.ModelForm): ..... 现在,我想在基于类的视图中获取表单,如下所示: 类FormCreateView(CreateView): 模型=用户 def post(self, request, *args, **kwargs): if self.req
class FormA(models.ModelForm):
...
class FormB(models.ModelForm):
....
class FormC(models.ModelForm):
.....
现在,我想在基于类的视图中获取表单,如下所示:
类FormCreateView(CreateView):
模型=用户
def post(self, request, *args, **kwargs):
if self.request.user.user_level == 1:
get FormA
if self.request.user.user_level == 2:
get FormB
if self.request.user.user_level == 3:
get Formc
return reverse('xyz')
所以我是这样做的。但是表单未提交,并且它给了我类型错误:
Exception Value:
is_valid() missing 1 required positional argument: 'self'
Exception Location:
/home/bishwa/PycharmProjects/sharefile/sharefile/users/views.py in post, line 64
阶级
class UserCreateView(CreateView):
model = User
# form_class = UserCreationForm
template_name = "users/create_user.html"
success_url= "/users/create"
def get_form_class(self):
if self.request.user.user_level == 1 or self.request.user.user_level == 10:
# form_class = UserCreationForm
return UserCreationForm
elif self.request.user.user_level == 20:
# form_class = UserCreationFormCompanyManager
return UserCreationFormCompanyManager
else:
# form_class = UserCreationFormHomeManager
return UserCreationFormHomeManager
def post(self, request, *args, **kwargs):
form = self.get_form_class()
user_level = User.objects.get(id=request.user.id)
# form = UserCreationFormHomeManager(request.POST)
# if request.method=='POST':
# form = UserCreationFormCompanyManager(request.POST)
if user_level == 20:
if form.is_valid():
obj = form.save(commit=False)
obj.company = self.request.user.company
# obj.password = make_password(form.cleaned_data['password'])
print(obj)
obj.save()
return obj
elif user_level == 30:
# if request.method=='POST':
# form = UserCreationFormHomeManager(request.POST)
if form.is_valid():
obj = form.save(commit=False)
obj.company = self.request.user.company
obj.home = self.request.user.home
# obj.password = make_password(form.cleaned_data['password'])
print(obj)
obj.save()
return obj
else:
# if request.method=='POST':
# form = UserCreationFormHomeManager(request.POST)
if form.is_valid():
# obj.password = make_password(form.cleaned_data['password'])
print(obj)
obj = form.save()
return obj
return HttpResponseRedirect(reverse('users:create-user'))
我的
form.py
中有这三个表单。当我试图通过请求调用表单时。POST
(即已注释的)方法表单未被保存 您可以使用以下方法选择表单:
我以前尝试过你说的方法,但它说我们必须返回一个实例,即
returnforma()
,否则form.is\u valid()
方法会给出错误。不,get\u form\u class
应该返回类,顾名思义。问题是您以后没有实例化表单,例如form=get\u form\u class()(request.POST)
。通常情况下,CreateView
会为您处理此问题,但您已失去此功能,因为您错误地覆盖了post
。查看视图,您可以将表单保存代码删除到form\u valid
而不是post
,并让基于类的视图处理表单实例化。但是您可能会发现使用常规的基于函数的视图更容易。
def get_form_class(self):
if self.request.user.user_level == 1:
return FormA
elif self.request.user.user_level == 2:
return FormB
elif self.request.user.user_level == 3:
return FormC
else:
return DefaultForm