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

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

Мой view.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')
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
2 963
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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, вы можете настроить соответственно.

Спасибо ! но я не понимаю, что мне нужно изменить в своей форме?

Nikita 19.03.2018 00:39

Пожалуйста. Возможно, вам не нужно ничего настраивать. Если RegisterForm действительно является ModelForm с моделью coach, этот код должен работать. Если это не так, вам нужно получить нужный объект для передачи в качестве экземпляра в форму.

Paulo Almeida 19.03.2018 00:43

Я корректирую свой код. теперь у меня есть "form = RegisterForm (request.POST or None, request.FILES, instance = coach_instance)", но теперь у меня прямо на этой странице ошибка "full_clean () отсутствует 1 обязательный позиционный аргумент: 'self'"

Nikita 19.03.2018 00:54

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

Paulo Almeida 19.03.2018 01:05

Да, конечно ! Я пытаюсь открыть Register.html и получаю сообщение об ошибке. Это полный след dpaste.com/29NKN68

Nikita 19.03.2018 01:12

Извините, я не могу понять это из этого. У вас действительно необычная структура представления. Возможно, стоит попробовать сделать представление похожим на более общий подход, хотя я не знаю, поможет ли это.

Paulo Almeida 19.03.2018 15:47

Я выяснил, почему у меня была ошибка «full_clean ()» .... Это была просто ошибка отвлечения: / Но теперь у меня есть еще одна ошибка, когда я хочу отправить форму «DoesNotExist Exception Value: запрос на сопоставление тренера не существует». Я изменил свое представление, чтобы иметь более общую структуру, и у меня по-прежнему возникает эта ошибка

Nikita 19.03.2018 16:16

Хорошо, я понимаю. Я отредактировал ответ с возможным решением. Вы try, чтобы получить объект "тренер" и создать новый, если он не существует. Могут быть более элегантные способы разметки кода, но это общая идея.

Paulo Almeida 19.03.2018 16:27

Спасибо за ваши ответы ! Это мне очень помогло ! Теперь все работает правильно!

Nikita 19.03.2018 16:38

Другие вопросы по теме