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
考虑以下代码:
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