【问题标题】:Get different forms in Django class based view based on condition根据条件在基于 Django 类的视图中获取不同的表单
【发布时间】:2019-06-06 15:55:07
【问题描述】:

假设我有如下表格:

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 中有这三种形式。当我尝试通过request.POST(即注释的那个)方法调用表单时,表单没有被保存。

【问题讨论】:

    标签: python django django-forms django-views django-class-based-views


    【解决方案1】:

    您可以使用get_form_class 方法中的选择表单:

    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
    

    【讨论】:

    • 我之前尝试过你说的方法,但它说我们必须返回一个实例,即return FormA(),否则form.is_valid()方法会出错。
    • 不,get_form_class 应该返回 class,顾名思义。问题是您稍后没有实例化表单,例如form = get_form_class()(request.POST)。通常CreateView 会为您处理这个问题,但是您已经失去了这个功能,因为您错误地覆盖了post。查看您的视图,您可以将表单保存代码删除到form_valid 而不是post,并让基于类的视图处理表单实例化。但是您可能会发现使用基于常规函数的视图会更容易。
    猜你喜欢
    • 2013-12-02
    • 1970-01-01
    • 2014-09-25
    • 2018-08-31
    • 2021-09-27
    • 1970-01-01
    • 2020-01-22
    • 2015-07-26
    • 1970-01-01
    相关资源
    最近更新 更多