Получить различные формы в представлении на основе классов Django в зависимости от условия - PullRequest
0 голосов
/ 11 января 2019

Предположим, у меня есть формы, как показано ниже:

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 (т.е. с одним комментарием), форма не сохраняется.

1 Ответ

0 голосов
/ 11 января 2019

Вы можете выбрать форму в методе 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
...