Метод save () формы модели Django не создает объект профиля - PullRequest
0 голосов
/ 21 апреля 2019

Рассмотрим следующий код:

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, тоже не работает.

Ответы [ 2 ]

1 голос
/ 21 апреля 2019

Я не думаю, что ваш метод вызывается.Сначала вам нужно изменить метод с 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'

Подробности об этом переопределении можно найти здесь

1 голос
/ 21 апреля 2019

Вы пытались связать модель кандидата с идентификатором вашей модели пользователя?Итак, для вашего случая что-то вроде этого:

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