我正在阅读有关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
对象。知道为什么这不起作用吗?
[UsersConfig.ready()
从不运行,因此您的信号不是seen(由Django
解决方案
users.apps.UsersConfig
添加到您的INSTALLED_APPS
或
default_app_config = 'users.apps.UsersConfig'
OR
基于该信息,我想您尚未在应用程序的default_app_config
文件中定义__init__.py
。
打开__init__.py
,该文件为空文件。在该行中,添加一行,指定default_app_config
的值,该值等于您在apps.py中定义的UsersConfig
类的路径。
应为以下内容:
default_app_config = 'users.apps.UsersConfig'
添加此行,它应该可以工作。