Невозможно обновить модели Django один-к-одному - PullRequest
0 голосов
/ 26 июня 2018

Я использую стандартную модель Django 'User' для создания пользователя.После успешного создания этот пользователь направляется на страницу профиля, где ему предлагается заполнить свой профиль.Профиль или модель Profile имеет OneToOneField с User.При первом сохранении профиль успешен, потому что первая вставка с request.user, а объект профиля еще не создан.

При последующих попытках изменить эту форму я получаю сообщение об ошибке

return Database.Cursor.execute (self, query, params) sqlite3.IntegrityError: Сбой ограничения NOT NULL: app_profile.user_id Вышеуказанное исключение было прямой причиной следующего исключения:.,return Database.Cursor.execute (self, query, params) django.db.utils.IntegrityError: Сбой ограничения NOT NULL: app_profile.user_id [26 / Jun / 2018 06:32:51] "POST / profile / HTTP / 1.1"500 162255

Вот моя Profile модель

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    type = models.CharField(choices=(
        ('content-creator', 'Content Creator'),
        ('artist', 'Artist'),
    ), max_length=20)
    about = models.CharField(max_length=100, blank=True)
    birth_date = models.DateField(null=True, blank=True)
    location = models.CharField(max_length=30, blank=True)

    youtube = models.URLField(null=True, blank=True)
    instagram = models.URLField(null=True, blank=True)
    facebook = models.URLField(null=True, blank=True)
    twitter = models.URLField(null=True, blank=True)
    website = models.URLField(null=True, blank=True)
    other = models.TextField(null=True, max_length=100, blank=True)

А вот Profile view

class ProfileView(LoginRequiredMixin, View):
    login_url = '/login/'
    redirect_field_name = 'redirect_to'

    form_class = ProfileForm
    template_name = 'app/profile.html'
    initial = {}

    def get(self, request, *args, **kwargs):
        profile = Profile.objects.get(user=request.user)
        if profile:
            form = ProfileForm(instance=profile)
        else:
            form = self.form_class(initial=self.initial)
        return render(request, self.template_name, {'form': form})

    def post(self, request, *args, **kwargs):
        form = ProfileForm(request.POST)
        if form.is_valid():
            profile_obj = form.save(commit=False)
            profile_obj.user = request.user
            profile_obj.save()
        return render(request, self.template_name, {'form': form})

Что я делаю не такмоя логика?Я думаю, что это должно быть довольно просто иметь дело, но я не могу разобраться с этим.

1 Ответ

0 голосов
/ 26 июня 2018

Вы не передаете instance аргумент в форму в методе post().Без этого Django пытается создать новый объект при каждом запросе POST.

def post(self, request, *args, **kwargs):
    profile = Profile.objects.filter(user=request.user).first()
    if profile: 
        form = ProfileForm(request.POST, instance=profile)
    else:
        form = ProfileForm(request.POST)
    if form.is_valid():
        profile_obj = form.save(commit=False)
        profile_obj.user = request.user
        profile_obj.save()
    return render(request, self.template_name, {'form': form})
...