【问题标题】:DJANGO: How to make validation of multiple forms based on class based views?DJANGO:如何根据基于类的视图验证多个表单?
【发布时间】:2018-08-31 01:57:12
【问题描述】:

我遇到了一次验证两个表单的问题。请帮帮我。我需要验证字段 username,但据我了解,我无法将 user_form 传递给 form_invalid 方法。

class TrainerCreateView(ActiveOnlyMixin, BrandOwnersPermissionMixin, CreateView):
    form_class = TrainerForm
    model = Trainer
    second_form_class = UserCreationForm

    def get_context_data(self, **kwargs):
        context = super(TrainerCreateView, self).get_context_data(**kwargs)
        context['user_form'] = self.second_form_class

    def form_valid(self, form):
        .......

    def form_invalid(self, form):
        return self.render_to_response(self.get_context_data(form=form))



from django.contrib.auth.forms import AuthenticationForm, UserCreationForm, UserChangeForm

class UserCreationForm(UserCreationForm):
    first_name = forms.CharField(required=True, label='Имя')
    last_name = forms.CharField(required=True, label='Фамилия')

    class Meta:
        model = User
        fields = ("email", "username", "password1", "password2", 'first_name', 'last_name')

    def clean_username(self):
        username = self.cleaned_data['username']
        if User.objects.exclude(pk=self.instance.pk).filter(username=username).exists():
            raise forms.ValidationError(u'Username "%s" is already in use.' % username)
        return username

谢谢!

【问题讨论】:

    标签: django forms validation


    【解决方案1】:

    好吧,没人知道,我通过改变模型解决了这个问题,我的意思是 form_class 和 second_form_class。所以,我仍然无法同时验证两个表单,但我可以验证主表单(用户注册详细信息),可能这些信息会对某人有所帮助。

    class TrainerCreateView(BrandOwnersPermissionMixin, CreateView):
        model = User
        form_class = UserCreationForm
        second_form_class = TrainerForm
        template_name = 'panel/accounts/trainer_form.html'
    
        def get_context_data(self, **kwargs):
            context = super(TrainerCreateView, self).get_context_data(**kwargs)
            return context
    
        def form_valid(self, form):
            try:
                trainer_form = TrainerForm(self.request.POST, self.request.FILES)
                with transaction.atomic():
                    if form.is_valid() and trainer_form.is_valid():
                        user = form.save()
                        trainer = trainer_form.save(commit=False)
                        trainer.user_id = user.id
                        trainer_group = Group.objects.get(name='trainers')
                        trainer_group.user_set.add(user)
                        trainer.save()
            except Exception as e:
                print(e)
            return HttpResponseRedirect(self.get_success_url(self))
    
        def form_invalid(self, form):
            return self.render_to_response(self.get_context_data(form=form))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-10
      • 2021-07-17
      • 1970-01-01
      • 2020-08-25
      • 2015-08-25
      • 1970-01-01
      • 2016-12-05
      • 2017-04-06
      相关资源
      最近更新 更多