#django #django-signals
#django #django-сигналы
Вопрос:
Я работаю над новым проектом Django, чтобы зарегистрировать учащихся и создать профиль для каждого учащегося после регистрации. Я получаю сообщение об ошибке при регистрации пользователя.
ОШИБКА
Ошибка значения в /students/register/
Не удается принудительно вставить и обновить при сохранении модели.
Ниже приведены мои фрагменты кода:
models.py
from django.db import models
from django.contrib.auth.models import User
from PIL import Image
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
image = models.ImageField(default='default.png', upload_to='students/profile_pics')
bio = models.TextField(null=True, blank=True, verbose_name='biography')
def __str__(self):
return f'{self.user.username} Profile'
def save(self, *args, **kwargs):
super().save(*args, *kwargs)
img = Image.open(self.image.path)
if img.height > 300 or img.width > 300:
output_size = (300, 300)
img.thumbnail(output_size)
img.save(self.image.path)
views.py
def register_student(request):
if request.method == 'POST':
form = StudentRegistrationForm(request.POST)
if form.is_valid():
form.save()
username = form.cleaned_data.get('username')
messages.success(request, f'Account created for {username}!')
return redirect('student_course_list')
else:
form = StudentRegistrationForm()
return render(request, 'students/student/registration.html', {'form': form})
forms.py
from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
class StudentRegistrationForm(UserCreationForm):
email = forms.EmailField(help_text='Enter a valid email address')
class Meta:
model = User
fields = ['username', 'email', 'password1', 'password2']
urls.py
from .views import register_student
urlpatterns = [
###
path('register/', register_student,
name='student_registration'),
]
signals.py
from django.db.models.signals import post_save
from django.contrib.auth.models import User
from django.dispatch import receiver
from .models import Profile
@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
@receiver(post_save, sender=User)
def save_profile(sender, instance, **kwargs):
instance.profile.save()
apps.py
from django.apps import AppConfig
class StudentsConfig(AppConfig):
name = 'students'
def ready(self):
import students.signals
settings.py
INSTALLED_APPS = [
###
'students.apps.StudentsConfig',
]
Я перепробовал все, но ничего не работает. На стороне администратора пользователи регистрируются, но профиль для них не создается.
Я жду ваших благородных ответов и лучших решений, спасибо.
Комментарии:
1. возможно, вам нужно удалить второй сигнал, вы пытаетесь выполнить обновление без значений
2. Хорошо, я проверю это
3. Я удалил второй сигнал, но все равно получаю ту же ошибку: невозможно принудительно вставить и обновить при сохранении модели.
Ответ №1:
Второй сигнал не требуется. Он выдает ошибку, потому что приведенный ниже сигнал обновляет объект в базе данных, который еще не создан.
@receiver(post_save, sender=User)
def save_profile(sender, instance, **kwargs):
instance.profile.save()
Комментарии:
1. Я посмотрю на это исправление
2. Я получаю ту же ошибку. Не удается принудительно вставить и обновить при сохранении модели.