Я разрабатываю сайт на 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')






Вам необходимо передать экземпляр изменяемого объекта, иначе будет создан новый, и сохранение не удастся, потому что это 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, вы можете настроить соответственно.
Пожалуйста. Возможно, вам не нужно ничего настраивать. Если RegisterForm действительно является ModelForm с моделью coach, этот код должен работать. Если это не так, вам нужно получить нужный объект для передачи в качестве экземпляра в форму.
Я корректирую свой код. теперь у меня есть "form = RegisterForm (request.POST or None, request.FILES, instance = coach_instance)", но теперь у меня прямо на этой странице ошибка "full_clean () отсутствует 1 обязательный позиционный аргумент: 'self'"
Не могу представить, откуда это взялось. Можете ли вы добавить к вопросу полную трассировку ошибки?
Да, конечно ! Я пытаюсь открыть Register.html и получаю сообщение об ошибке. Это полный след dpaste.com/29NKN68
Извините, я не могу понять это из этого. У вас действительно необычная структура представления. Возможно, стоит попробовать сделать представление похожим на более общий подход, хотя я не знаю, поможет ли это.
Я выяснил, почему у меня была ошибка «full_clean ()» .... Это была просто ошибка отвлечения: / Но теперь у меня есть еще одна ошибка, когда я хочу отправить форму «DoesNotExist Exception Value: запрос на сопоставление тренера не существует». Я изменил свое представление, чтобы иметь более общую структуру, и у меня по-прежнему возникает эта ошибка
Хорошо, я понимаю. Я отредактировал ответ с возможным решением. Вы try, чтобы получить объект "тренер" и создать новый, если он не существует. Могут быть более элегантные способы разметки кода, но это общая идея.
Спасибо за ваши ответы ! Это мне очень помогло ! Теперь все работает правильно!
Спасибо ! но я не понимаю, что мне нужно изменить в своей форме?