Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在基于Django类的视图中根据条件获取不同的表单_Python_Django_Django Forms_Django Views_Django Class Based Views - Fatal编程技术网

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