Ошибка ограничения Django UNIQUE: Site_coach.user_id

Я разрабатываю сайт на Python Django. У меня есть шаблон Register.html с функцией "Регистрация". Я хочу, чтобы мои пользователи размещали свою дополнительную информацию на этой странице после того, как они зарегистрировались на другой странице. Моя проблема заключается в том, что когда мои пользователи впервые помещают свою дополнительную информацию в мою форму, она работает, но затем, если мои пользователи хотят обновить свою информацию из той же формы на той же странице, они получают сообщение об ошибке «Ошибка ограничения UNIQUE: Site_coach.user_id " Я начинающий. Можете ли вы помочь мне исправить эту ошибку?

Мой взгляд.py

from django.shortcuts import render
from .forms import RegisterForm

def Register(request):

    form = RegisterForm(request.POST or None, request.FILES)
    if form.is_valid():
        obj = form.save(commit=False)
        obj.user = request.user
        form.save()
    return render(request, 'Register.html', {'form': form})

Мой сайт/models.py

class coach(models.Model):
    user = models.OneToOneField(CustomUser,on_delete=models.CASCADE)
    Telephone = models.IntegerField()
    TestResult = models.IntegerField(null=True, blank=True)
    Level = models.TextField()

Мои пользователи/models.py

from django.contrib.auth.models import AbstractUser, UserManager
from django.db import models

class CustomUserManager(UserManager):
    pass
class CustomUser(AbstractUser):
    objects = CustomUserManager()

Мои формы.py

from django import forms
from .models import coach
class RegisterForm(forms.ModelForm):
    class Meta:
        model = coach
        exclude = ('user','TestResult')

person Nikita    schedule 18.03.2018    source источник


Ответы (1)


Вам нужно передать экземпляр изменяемого объекта, иначе будет создан новый, и сохранение не удастся, потому что это OneToOne:

def Register(request):
    try:
        coach_instance = coach.objects.get(user=request.user)
    except coach.DoesNotExist:
        coach_instance = coach(user=request.user)
    form = RegisterForm(request.POST or None, request.FILES, instance=coach_instance)
    if form.is_valid():
        obj = form.save(commit=False)
        obj.user = request.user
        form.save()
    return render(request, 'Register.html', {'form': form})

Я предполагаю, что RegisterForm - это ModelForm с моделью coach, вы можете настроить соответственно.

person Paulo Almeida    schedule 18.03.2018
comment
Благодарю вас ! но я не понимаю, что мне нужно настроить в моей форме? - person Nikita; 19.03.2018
comment
Пожалуйста. Возможно, вам не нужно ничего настраивать. Если RegisterForm действительно является ModelForm с моделью coach, этот код должен работать. Если это не так, вам нужно получить правильный объект для передачи в качестве экземпляра в форму. - person Paulo Almeida; 19.03.2018
comment
Я корректирую свой код. теперь у меня есть form = RegisterForm(request.POST или None, request.FILES, instance=coach_instance), но теперь у меня прямо ошибка на этой странице full_clean() отсутствует 1 обязательный позиционный аргумент: 'self' - person Nikita; 19.03.2018
comment
Не могу представить, откуда это. Можете ли вы добавить полную трассировку ошибки к вопросу? - person Paulo Almeida; 19.03.2018
comment
Да, конечно ! Итак, я пытаюсь открыть Register.html и получаю сообщение об ошибке. Это полная трассировка dpaste.com/29NKN68. - person Nikita; 19.03.2018
comment
Извините, я не могу понять это из этого. У вас действительно необычная структура представления. Возможно, стоит попытаться сделать представление похожим на более распространенный подход., хотя я не знаю, поможет ли это. - person Paulo Almeida; 19.03.2018
comment
Я понял, почему у меня была ошибка full_clean() .... Это была просто ошибка отвлечения внимания: / Но теперь у меня есть другая ошибка, когда я хочу отправить свою форму. Значение исключения DoesNotExist: тренер, соответствующий запросу, не существует. Я изменил свое представление, чтобы иметь более общую структуру, и у меня по-прежнему возникает эта ошибка. - person Nikita; 19.03.2018
comment
Хорошо, это я понимаю. Я отредактировал ответ с возможным решением. Вы try получаете объект тренера и создаете новый, если он не существует. Могут быть более элегантные способы размещения кода, но это общая идея. - person Paulo Almeida; 19.03.2018
comment
Спасибо за ваши ответы ! Это мне очень помогло ! Теперь все работает корректно! - person Nikita; 19.03.2018