Используйте функцию сигнала для создания объекта профиля при создании объекта пользователя - PullRequest
1 голос
/ 23 октября 2019

Я следую учебному пособию по Django, и у меня есть следующие models.py

from django.db import models
from django.contrib.auth.models import User
class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    image = models.ImageField(default = 'default.jpg', upload_to = 'profile_pics')

    def __str__(self):
        return f"{self.user.username} Profile"

Я использую представление register для создания User объекта:

def register(request):
    if request.method == 'POST': # if form was submitted w data
        form = UserRegisterForm(request.POST) #instantiate form w post data
        if form.is_valid():
            form.save() #save user to db
            username = form.cleaned_data.get('username') #get this to print out success message
            messages.success(request, f"Your account has been created. You are now able to log in.") #Formatted string literal for f-string
            return redirect('login')
    else:
        form = UserRegisterForm()
    return render(request, 'users/register.html', {'form':form})

При создании объекта User я пытаюсь использовать сигналы для создания объекта Profile. Я создал файл 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

#Run this function every time a User is created
@receiver(post_save, sender = User)
def create_profile(sender, instance, created, **kwargs):
    if created: #if User was created
        Profile.objects.create(user = instance)

 @receiver(post_save, sender = User)
 def save_profile(sender, instance, **kwargs):
     instance.profile.save()

и импортировал сигналы в методе ready apps.py:

from django.apps import AppConfig


class UsersConfig(AppConfig):
    name = 'users'

    # To make signals work you have to import your signals
    # inside the ready method of our apps.py module
    def ready(self):
        import users.signals

Однако присоздание нового User до сих пор не связано Profile объект. Есть идеи, почему это не работает?

Ответы [ 2 ]

2 голосов
/ 23 октября 2019

UsersConfig.ready() никогда не запускается , и поэтому ваши сигналы не видны Джанго

Решения

  1. Добавьте users.apps.UsersConfig к вашему INSTALLED_APPS

ИЛИ

Добавьте default_app_config = 'users.apps.UsersConfig' в ваш __init__.py

ИЛИ

Просто добавьте свои сигналы прямо в вашем models.py

Оформить заказ: https://docs.djangoproject.com/en/2.2/ref/applications/

0 голосов
/ 23 октября 2019

Судя по информации, вы не определили default_app_config в файле __init__.py приложения.

Откройте __init__.py, который будет пустым файлом. В этом добавьте строку, которая задает значение default_app_config, равное пути к классу UsersConfig, который вы определили в apps.py.

Должно быть следующее:

default_app_config = 'users.apps.UsersConfig'

Добавьте эту строку, и она должна работать.

...