Django 模型表单 save() 方法不创建配置文件对象

Django model form save() method not creating profile object

考虑以下代码:

class CandidateSignUpForm(forms.ModelForm):
first_name = forms.CharField(max_length=50, widget=forms.TextInput(attrs={'placeholder': 'Ime', 'class': 'validate'}))
last_name = forms.CharField(max_length=50, widget=forms.TextInput(attrs={'placeholder': _('Prezime'), 'class': 'validate'}))

class Meta:
    model = User
    fields = ('email', 'password', 'first_name', 'last_name')
    widgets = {
        'email': forms.EmailInput(
            attrs = {
                'placeholder': _('E-mail'),
                'class': 'validate'
            },
        ),

        'password': forms.PasswordInput(
            attrs = {
                'placeholder': _('Lozinka'),
                'class': 'validate'
            },
        ),

    }

def signup(self, user):
    user.first_name = self.cleaned_data['first_name']
    user.last_name = self.cleaned_data['last_name']
    user.email = self.cleaned_data['email']
    user.password = self.cleaned_data['password']

    user.save()

    candidate = Candidate()
    candidate.user = user
    candidate.save()

和我的 models.py:

class User(AbstractUser):
    is_candidate = models.BooleanField(default=True)
    is_employer = models.BooleanField(default=False)
    is_admin = models.BooleanField(default=False)

    first_name = models.CharField(max_length=50, null=True)
    last_name = models.CharField(max_length=50, null=True)

    mobile =  models.IntegerField(null=True, unique=True)
    address = models.CharField(max_length=250, null=True)

    def __str__(self):
        return self.email

class Candidate(models.Model):
    user = models.OneToOneField(
        User, on_delete=models.CASCADE, primary_key=True
    )

    available_from = models.DateField(blank=True, null=True)
    dob = models.PositiveSmallIntegerField(blank = True, null=True)
    about = models.TextField(max_length=500, blank = True, null=True)

    def __str__(self):
        return self.user.first_name + ' ' + self.user.last_name

现在,假设我使用的是 Django AllAuth,我需要覆盖 signup 方法,以便能够保存 User 对象。使用上述代码,我的 User 被正确保存,而 Candidate 根本没有保存,即 candidate table.

中没有记录

我几乎什么都试过了,但仍然无法弄清楚哪里出了问题。

更新:

candidate.user = user 更改为 candidate.user = user.pk,也不行。

您是否尝试过使用您的用户模型的 ID link 候选模型? 所以,对于你的情况是这样的:

user = user.save()
candidate = Candidate.objects.create(user_id=user.id)

我认为您的方法没有被调用。首先,您需要将方法从 def signup(self, request) 更改为 def signup(self, request, user):

class CandidateSignUpForm(forms.Form):
    first_name = forms.CharField(...)
    last_name = forms.CharField(...)

    def signup(self, request, user):
        user.first_name = self.cleaned_data['first_name']
        user.last_name = self.cleaned_data['last_name']
        user.save()
        candidate = Candidate()
        candidate.user = user
        candidate.save()

然后从这样的设置中指向 From:

ACCOUNT_SIGNUP_FORM_CLASS = 'PATH.TO.CandidateSignUpForm'

可以找到有关此覆盖的详细信息here