【问题标题】:Django model form save() method not creating profile objectDjango模型表单save()方法不创建配置文件对象
【发布时间】:2019-04-21 03:18:38
【问题描述】:

考虑以下代码:

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 对象。使用上述代码,我的用户被正确保存,而候选人根本没有保存,即候选人表中没有记录。

我几乎尝试了所有方法,但仍然无法弄清楚可能出了什么问题。

更新:

candidate.user = user 更改为candidate.user = user.pk,也不起作用。

【问题讨论】:

  • 试试这个candidate.user = user.pk 还有,有没有例外?
  • @shafik nope,这也行不通。

标签: django django-models django-forms modelform


【解决方案1】:

我认为没有调用您的方法。首先你需要把方法从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找到有关此覆盖的详细信息

【讨论】:

    【解决方案2】:

    您是否尝试过将 Candidate-Model 与您的 User-Model 的 ID 关联起来? 所以,对于你的情况是这样的:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-05
      • 2018-08-18
      • 2012-06-13
      • 2011-03-26
      • 2022-10-14
      相关资源
      最近更新 更多