Django post_signal在form.save(commit = False)上触发 [英] django post_signal triggered on form.save(commit=False)

查看:54
本文介绍了Django post_signal在form.save(commit = False)上触发的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个基本的 User 模型和另外两个候选人公司

I have a base User model and two other models Candidate and Company

User:
  email
  password
  is_company => default=False

表单类:

class CustomUserCreationForm(forms.Form):
    email = forms.EmailField(label='Enter email', widget=forms.EmailInput(attrs={'placeholder': 'Email Address', 'spellcheck':'False', 'autofocus':'True'}))
    password = forms.CharField(label='Enter password', min_length=8, widget=forms.PasswordInput(attrs={'placeholder': 'Password'}))

    def clean_email(self):
        email = self.cleaned_data['email'].lower()
        r = User.objects.filter(email=email)
        if r.count():
            raise  ValidationError("Email already exists")
        return email

    def clean_password(self):
        password = self.cleaned_data.get('password')
        return password

    def save(self, commit=True):
        user = User.objects.create_user(
            self.cleaned_data['email'],
            self.cleaned_data['password']
        )
        return user

我的UserManager:

My UserManager:

class UserManager(BaseUserManager):
    use_in_migrations = True

    def _create_user(self, email, password, **extra_fields):
        """
        Creates and saves a User with the given email and password.
        """
        try:
            validate_email(email)
            valid_email = True
        except ValidationError:
            valid_email = False
        if not valid_email:
            raise ValueError('Valid Email is required')
        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        subject = 'Activate Your Account'
        message = render_to_string('registration/account_activation_email.html', {
            'domain': 'example.in',
            'user': user,
            'uid': urlsafe_base64_encode(force_bytes(user.pk)),
            'token': account_activation_token.make_token(user),
        })
        user.email_user(subject, 'example <admin@example.in>', html_message=message)
        return user

    def create_user(self, email, password=None, **extra_fields):
        extra_fields.setdefault('is_superuser', False)
        return self._create_user(email, password, **extra_fields)

    def create_superuser(self, email, password, **extra_fields):
        extra_fields.setdefault('is_superuser', True)

        if extra_fields.get('is_superuser') is not True:
            raise ValueError('Superuser must have is_superuser=True.')

        return self._create_user(email, password, **extra_fields)

在我的用户创建视图中:

In my user creation view:

class SignUpView(View):
    is_company = False
    def get(self, request):
        if request.user.is_authenticated():
            return redirect(reverse_lazy('dashboard'))
        form = CustomUserCreationForm()
        return render(request, 'registration/signup.html', {'form': form, 'is_company':self.is_company})

    def post(self,request):
        form = CustomUserCreationForm(request.POST or None, request.FILES or None)
        if form.is_valid():
            user = form.save(commit=False)
            user.is_active = False
            user.is_company = self.is_company
            user.save()
            return render(request, 'registration/account_activation_sent.html')
        return render(request, 'registration/signup.html', {'form': form, 'is_company':self.is_company})

我为上述模型创建了一个post_save信号.

I have created a post_save signal for the above model.

  @receiver(post_save, sender=User)
  def update_user_profile(sender, instance, created, **kwargs):
      if created:
          if instance.is_company:
              Company.objects.create(user=instance)
              instance.company.save()
        else:
            Candidate.objects.create(user=instance, 
                                   first_name=instance.is_company )
            instance.candidate.save()

urls.py:

url(r'^accounts/signup/company/',vw.SignUpView.as_view(is_company = True), name='signup_company')

问题是 form.save(commit = False)触发了post_save信号.我最终将 instance.is_company 作为 False ,从而为公司创建了CandidateProfile.

The problem is the form.save(commit=False) is triggering the post_save signal. I end up having instance.is_company as False, thus creating a CandidateProfile for a Company.

但是数据库用户表的is_company填充为公司的True.

But the the database user table is populated with is_company as True for the company.

请帮助!

推荐答案

将参数更改为默认False,然后在保存之前检查此参数是否为真...用您的方式进行操作,如果您以commit false或true进行调用,它们就很重要将始终保存在数据库中...因此,它们会触发您的post_save

Change your argument to default False and check if this is true before saving... with your way doenst matter if you call it with commit false or true, they will always save in data base... so because of that they are triggers your post_save

def save(self, commit=False):
    if commit:
        user = User.objects.create_user(
            self.cleaned_data['email'],
            self.cleaned_data['password']
        )

这篇关于Django post_signal在form.save(commit = False)上触发的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆