Не удается создать профиль для нового зарегистрированного пользователя в Django

#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. Я получаю ту же ошибку. Не удается принудительно вставить и обновить при сохранении модели.