Невозможно назначить "'type1'": "users.user_type" должен быть экземпляром "types" - PullRequest
0 голосов
/ 18 марта 2020

У меня есть модель 'users', которая имеет модель OneToOneField для UserModel и модель ForeignKey Field для модели 'types'. Как сохранить файл ForeignKeyField в базе данных?

models.py:

class types(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, default='')
    name = models.CharField(max_length=100)

    def __str__(self):
        return self.name


class users(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, default='')
    user_type = models.ForeignKey(types, on_delete=models.SET_NULL, blank=True, null=True)
    mobile = models.CharField(max_length=20)

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

    @property
    def full_name(self):
        return '%s %s' % (self.user.first_name, self.user.last_name)


@receiver(post_save, sender=User)
def update_user_users(sender, instance, created, **kwargs):
    if created:
        users.objects.create(user=instance)
    instance.users.save()

views.py:

def signup(request):
    if request.method == 'POST':
        form = forms.SignUpForm(request.POST)
        if form.is_valid():
            user = form.save()
            user.refresh_from_db()
            user.users.mobile = form.cleaned_data.get('mobile')
            user.users.user_type = form.cleaned_data.get('user_type')
            user.save()
            raw_password = form.cleaned_data.get('password1')
            user = authenticate(username=user.username, password=raw_password)
            login(request, user)
            return redirect('index')
    else:
        form = forms.SignUpForm()
    return render(request, 'user/signup.html', {'form': form})

forms.py:

lass SignUpForm(UserCreationForm):
    mobile = forms.CharField(max_length=20)
    user_type = forms.CharField(max_length=100)

    class Meta:
        model = User
        fields = ('username',
                  'password1',
                  'password2',
                  'first_name',
                  'last_name',
                  'mobile',
                  'user_type',
                  )

Но у меня есть эта ошибка:

Невозможно назначить «type1»: «users.user_type» должен быть экземпляром «types».

1 Ответ

1 голос
/ 18 марта 2020
form.cleaned_data.get('user_type')

Вы получите строку из кода. Но users.user_type должен быть установлен как экземпляр типов. Итак, вы должны создать экземпляр, используя существующего пользователя, прежде чем вызывать form.save ().

types.objects.create(user=user1, name=form.cleaned_data.get('user_type'))

Кстати, почему типы должны иметь OneToOneField to User?

...