使用信号函数在创建用户对象时创建配置文件对象
Use signal function to create Profile object upon creation of User object
我正在学习有关 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()
并在 apps.py
的 ready
方法中导入了信号:
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
对象。知道为什么这不起作用吗?
根据信息,我猜你没有在应用程序的 __init__.py
文件中定义 default_app_config
。
打开 __init__.py
这将是一个空文件。
在其中,添加一行指定 default_app_config
的值,该值等于您在 apps.py 中定义的 UsersConfig
class 的路径。
应该是:
default_app_config = 'users.apps.UsersConfig'
添加这一行,它应该可以工作。
UsersConfig.ready()
永远不会运行 因此你的信号不会被 Django 看到
解决方案
- 将
users.apps.UsersConfig
添加到您的 INSTALLED_APPS
或
- 在您的
__init__.py
中添加 default_app_config = 'users.apps.UsersConfig'
或
- 只需在 models.py
中直接添加信号
我正在学习有关 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()
并在 apps.py
的 ready
方法中导入了信号:
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
对象。知道为什么这不起作用吗?
根据信息,我猜你没有在应用程序的 __init__.py
文件中定义 default_app_config
。
打开 __init__.py
这将是一个空文件。
在其中,添加一行指定 default_app_config
的值,该值等于您在 apps.py 中定义的 UsersConfig
class 的路径。
应该是:
default_app_config = 'users.apps.UsersConfig'
添加这一行,它应该可以工作。
UsersConfig.ready()
永远不会运行 因此你的信号不会被 Django 看到
解决方案
- 将
users.apps.UsersConfig
添加到您的INSTALLED_APPS
或
- 在您的
__init__.py
中添加
default_app_config = 'users.apps.UsersConfig'
或
- 只需在 models.py 中直接添加信号