我刚刚开始在django项目中实现信号监听器.虽然我明白它们是什么以及如何使用它们.我很难搞清楚应该放在哪里.来自django网站的文档有这样的说法:
您可以将信号处理和注册码放在任何您喜欢的地方.但是,您需要确保早期导入模块,以便在需要发送任何信号之前注册信号处理.这使您的应用程序的models.py成为放置信号处理程序注册的好地方.
虽然这是一个很好的建议,但在我的models.py中使用非模型类或方法只会让我误以为然.
那么,存储和注册信号处理程序的最佳实践/规则是什么?
嗨,我正在定义自己的信号和接收器.我只是想知道我应该把代码放在哪里.它位于models.py或views.py中.请帮忙
我有一个自定义User模型,MyUser因为它在一个完整的例子中描述了文档上的自定义用户模型,所谓的UserProfile是MyUser通过一对一的关系连接,就像在Django文档中描述的关于如何扩展一个现有的用户模型.
在定制身份验证的文档中,有关如何将post_save信号与现有User模型连接的示例.
接下来,我将一个测试接收器放在一个由我的apps.py文件加载的signals.py中,就像在这个 SO答案中描述的那样.
def post_save_receiver(sender, instance, created, **kwargs):
send_mail('Testing', "Just testing...", 'hell@earth.tld', ['admin@heaven.tld'], fail_silently=False)
post_save.connect(post_save_receiver, sender=settings.AUTH_USER_MODEL)
Run Code Online (Sandbox Code Playgroud)
class MyUserManager(BaseUserManager):
def create_user(self, email, password=None):
"""
Creates and saves a User with the given email and password.
"""
if not email:
raise ValueError('Users must have an email address')
user = self.model(
email=self.normalize_email(email),
) …Run Code Online (Sandbox Code Playgroud) 我一直在寻找解决这个问题,我想在我的Profile模型中添加简单的东西,如头像,联系信息等.但是,当我在网上找到如何做到这一点的教程时,我只遇到了错误.
这就是我的模型(track/models.py):
from django.db import models
from django.core.exceptions import ValidationError
from django.core.files.images import get_image_dimensions
from django.contrib.auth.models import User
...
class Profile(models.Model):
def generate_user_folder_avatar(instance, filename):
return "uploads/users/%s/%s.png" % (instance.user, 'avatar')
user = models.OneToOneField(User)
avatar = models.ImageField(upload_to=generate_user_folder_avatar,validators=[is_square_png])
def create_user_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
post_save.connect(create_user_profile, sender=User)
Run Code Online (Sandbox Code Playgroud)
我已经设置了AUTH_PROFILE_MODULE = 'tracks.Profile'settings.py,但是当我运行我的服务器时,我收到此错误:
NameError: name 'post_save' is not defined
Run Code Online (Sandbox Code Playgroud)
知道我在这里做错了什么吗?我正在使用Django 1.9和Python 3