我有一个保持磁盘缓存的抽象模型.当我删除模型时,我需要它来删除缓存.我希望每个派生模型都能实现这一点.
如果我连接指定抽象模型的信号,则不会传播到派生模型:
pre_delete.connect(clear_cache, sender=MyAbstractModel, weak=False)
Run Code Online (Sandbox Code Playgroud)
如果我尝试在init中连接信号,在那里我可以获得派生类名,它可以工作,但我担心它会尝试清除缓存,就像我初始化派生模型一样多次,而不是一次.
我应该在哪里连接信号?
有没有办法使用django pre_delete信号取消删除记录?
例:
def on_delete(sender,**kwargs):
if not <some condition>:
#cancel the deletion
# else continue with the deletion
pre_delete.connect(on_delete,sender=MyModel)
Run Code Online (Sandbox Code Playgroud)
另一个问题是有一种方式可以对模型说" 在更改文件之前先删除原始文件 ",因为现在这就是我所做的(见下面的代码),我不确定这是否是最好的方式做到这一点.
def on_save(sender,**kwargs):
obj = kwargs['instance']
try:
id = obj.pk
# find the file
original_file = sender.objects.get(pk=id)
# delete the original file before uploading a new file
original_file.file.delete()
except ....
pre_save.connect(on_save,sender=ModelWithFileUpload)
Run Code Online (Sandbox Code Playgroud)
(在django 1.2中,他们会在更改或删除时自动删除文件但在django 1.3中他们删除了此功能)
提前致谢
我正在使用Django的post_save信号,只要有新文章添加到网站,就会向用户发送电子邮件.但是,每当我使用save()已创建文章的方法时,用户仍会收到新电子邮件.如果添加新条目,如何才能接收电子邮件?
提前致谢
是否可以在django管理表单上编辑实际对象之前保存相关对象?
例如:
在 models.py
class Parent(model.Model):
pass
class Child(model.Model):
parent = models.ForeignKey(Parent)
@receiver(post_save,sender = Parent)
def notify_parent_save(sender, instance=None, **kwargs):
print "Parent save"
@receiver(post_save,sender = Child)
def notify_child_save(sender, instance=None, **kwargs):
print "Child saved"
Run Code Online (Sandbox Code Playgroud)
在 admin.py
class ChildInline(admin.TabularInline):
model = Child
extra = 1
class ParentsAdmin(admin.ModelAdmin):
inlines = [ChildInline]
admin.site.register(Parent,ParentsAdmin)
Run Code Online (Sandbox Code Playgroud)
现在,在django admin中,如果我保存父对象,它将在控制台上输出.
Parent save
Child save
Run Code Online (Sandbox Code Playgroud)
我需要这个按照顺序发生:
Child save
Parent save
Run Code Online (Sandbox Code Playgroud) 考虑以下:
class OrderForm(models.Model):
title = models.CharField(max_length=100)
desc = models.TextField()
class OrderFormLine(models.Model):
order = models.ForeignKey(OrderForm)
lagel = models.CharField(max_length=100)
qty = models.IntegerField(...)
price = models.FloatField(...)
Run Code Online (Sandbox Code Playgroud)
现在,我想发送一封包含订单表格详细信息的电子邮件,无论何时有人创建或修改一个.
到目前为止还没有火箭科学..让我们只使用post_save信号;
post_save.connect(email_notify, sender=OrderForm)
Run Code Online (Sandbox Code Playgroud)
但是有一个小问题,传递给email_notify的OrderForm对象会按预期更新新数据,但不会更新相关的OrderFormLine项.
我试图覆盖管理员和模型中的保存方法,我试图保存对象,表单及其关系,然后将其传递给我的通知处理程序,没有任何作用.
我知道我可以将post_save信号附加到OrderItem模型,但随后会为每个项目发送电子邮件.
帮助我处于疯狂的边缘.
更新:
短篇故事:
def email_notify_orderform(sender, **kwargs):
instance = kwargs['instance']
ct = ContentType.objects.get_for_model(OrderForm)
if ct.id == instance.content_type.id:
print instance.is_addition()
print instance.is_change()
print instance.is_deletion()
print instance.change_message
print instance.action_time
print instance.get_edited_object().total() # BINGO !
post_save.connect(email_notify_orderform, sender=LogEntry)
Run Code Online (Sandbox Code Playgroud) django django-signals django-models django-forms django-admin
我已经在django开发了一段时间了,并开发了一个整洁的网站,其功能包括写博客,发布问题,共享内容等.但是仍有一件事情遗失,即为用户创建通知.
我想要做的是在用户的个人资料中告知用户,无论何时有人评论他们的帖子,或者他们是否关注某个帖子并且有更新,然后通知用户该更新.我查看了很多应用程序,但我仍然对如何做到这一点感到很困惑.
在使用的情况下,django-notification我似乎有一个印象(这可能是错误的),我只能通过电子邮件通知用户,即我无法在用户个人资料中显示这些通知,就像我们在Facebook上.
首先我想知道我是不是错了,然后我真的需要一些适当的教程或指导如何去做.我知道如何注册通知并将其发送到正确的信号,但是没有关于如何在模板中显示这些通知的文档,如果可以的话.
任何指导/教程/入门文档将深表感谢.
python django django-signals django-apps django-notification
在我的应用程序中,我想跟踪所有正在删除的问题.所以我在我的模型文件中创建了一个类(表).
class Deleted(models.Model):
question = models.IntegerField(null=True, blank=True)#id of question being deleted
user = models.IntegerField(null=True, blank=True)#id of user deleting the question
dt = models.DateTimeField(null=True, blank=True)#time question is deleted
Run Code Online (Sandbox Code Playgroud)
当用户尝试删除问题时调用此删除功能:
def delete_questions(request, user, questions):
for q in questions:
q.delete()
Run Code Online (Sandbox Code Playgroud)
我的疑问是我如何制作django的pre_delete信号来填充我创建的新表.
〜新手尝试重大任务〜先谢谢:)
我创建了一个"配置文件"模型(与用户模型具有一对一的关系),如扩展现有用户模型所述.配置文件模型与另一个模型具有可选的多对一关系:
class Profile(models.Model):
user = models.OneToOneField(User, primary_key=True)
account = models.ForeignKey(Account, blank=True, null=True, on_delete=models.SET_NULL)
Run Code Online (Sandbox Code Playgroud)
正如那里记录的那样,我还创建了一个内联管理员:
class ProfileInline(admin.StackedInline):
model = Profile
can_delete = False
verbose_name_plural = 'profiles'
# UserAdmin and unregister()/register() calls omitted, they are straight copies from the Django docs
Run Code Online (Sandbox Code Playgroud)
现在,如果account在创建用户时未在管理员中选择a ,则不会创建配置文件模型.所以我再次连接到post_save信号,只需按照文档:
@receiver(post_save, sender=User)
def create_profile_for_new_user(sender, created, instance, **kwargs):
if created:
profile = Profile(user=instance)
profile.save()
Run Code Online (Sandbox Code Playgroud)
只要我没有account在管理员中选择一个,这个工作正常,但如果我这样做,我会得到一个IntegrityError例外,告诉我duplicate key value violates unique constraint "app_profile_user_id_key" DETAIL: Key (user_id)=(15) …
我使用Django 1.7迁移,特别是想要用初始数据填充新创建的数据库.因此,我使用数据迁移.它看起来像这样:
def populate_with_initial_data(apps, schema_editor):
User = apps.get_model("auth", "User")
new_user = User.objects.create(username="nobody")
class Migration(migrations.Migration):
...
operations = [
migrations.RunPython(populate_with_initial_data),
]
Run Code Online (Sandbox Code Playgroud)
同时,我希望UserDetails每个新用户都有一个模型实例:
@receiver(signals.post_save, sender=django.contrib.auth.models.User)
def add_user_details(sender, instance, created, **kwargs):
if created:
my_app.UserDetails.objects.create(user=instance)
Run Code Online (Sandbox Code Playgroud)
但是:此信号仅在迁移之外有效.原因是,apps.get_model("auth", "User")与django.contrib.auth.models.User没有发送信号的情况完全不同.如果我尝试手动执行此操作,则会失败:
signals.post_save.send(django.contrib.auth.models.User, instance=julia, created=True)
Run Code Online (Sandbox Code Playgroud)
这失败了,因为那时,信号处理程序尝试使用O2O 创建一个新的 UserDetails指向历史记录 User:
ValueError: Cannot assign "<User: User object>": "UserDetails.user" must be a "User" instance.
Run Code Online (Sandbox Code Playgroud)
游民.
好的,我可以直接调用信号处理程序.但是我必须UserDetails在关键字参数(以及它需要的其他历史类)中传递历史类.此外,UserDetails具有此数据迁移的应用程序不是具有此数据迁移的应用程序,因此这将是一个丑陋的依赖性,很容易破坏,例如,如果UserDetails应用程序被删除INSTALLED_APPS.
那么,这只是一个当前的限制,我必须解决丑陋的代码和FixMe评论?或者有没有办法从数据迁移中发送信号?
我有一个模型 - 产品,其中包含缩略图.我有另一个模型,其中包含与产品相关的图像 - ProductImage.我希望在删除产品实例时从服务器中删除缩略图和图像,有一段时间这似乎有效,但现在不行了.
相关代码......
Class Product(models.Model):
title = Charfield
thumbnail = ImageField(upload_to='thumbnails/', verbose_name='thumbnail', blank=True, )
Class ProductImage(models.Model):
product = models.ForeignKey(plant, default=None, related_name='images')
image = models.ImageField(upload_to='images/', verbose_name='image',)
Run Code Online (Sandbox Code Playgroud)
以下删除方法(在产品类中)正在运行,但我更改了我的代码并且它不再有效 - 从我所读到的最佳做法是使用post_delete,而不是覆盖delete()
def delete(self):
images = ProductImage.objects.filter(product=self)
if images:
for image in images:
image.delete()
super(Product, self).delete()
Run Code Online (Sandbox Code Playgroud)
如何重写一个能实现我想要的删除方法?我曾尝试使用post_delete但到目前为止我一直没有成功,因为我不确定如何在删除ProductImage实例时应用它...