标签: django-signals

如何在抽象模型中使用Django信号?

我有一个保持磁盘缓存的抽象模型.当我删除模型时,我需要它来删除缓存.我希望每个派生模型都能实现这一点.

如果我连接指定抽象模型的信号,则不会传播到派生模型:

pre_delete.connect(clear_cache, sender=MyAbstractModel, weak=False)
Run Code Online (Sandbox Code Playgroud)

如果我尝试在init中连接信号,在那里我可以获得派生类名,它可以工作,但我担心它会尝试清除缓存,就像我初始化派生模型一样多次,而不是一次.

我应该在哪里连接信号?

django django-signals django-models

12
推荐指数
3
解决办法
2795
查看次数

如何取消django信号中的删除

有没有办法使用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 django-signals

12
推荐指数
1
解决办法
4526
查看次数

Django仅为新条目发出信号

我正在使用Django的post_save信号,只要有文章添加到网站,就会向用户发送电子邮件.但是,每当我使用save()已创建文章的方法时,用户仍会收到新电子邮件.如果添加新条目,如何才能接收电子邮件?

提前致谢

python django django-signals

12
推荐指数
1
解决办法
2450
查看次数

在django admin上编辑实际对象之前保存相关对象

是否可以在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)

django django-signals django-models django-admin

12
推荐指数
3
解决办法
6640
查看次数

django post_save信号发送过时的内联表单集

考虑以下:

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

11
推荐指数
1
解决办法
1706
查看次数

当有人评论他们的帖子时,如何使用django-notification通知用户

我已经在django开发了一段时间了,并开发了一个整洁的网站,其功能包括写博客,发布问题,共享内容等.但是仍有一件事情遗失,即为用户创建通知.

我想要做的是在用户的个人资料中告知用户,无论何时有人评论他们的帖子,或者他们是否关注某个帖子并且有更新,然后通知用户该更新.我查看了很多应用程序,但我仍然对如何做到这一点感到很困惑.

在使用的情况下,django-notification我似乎有一个印象(这可能是错误的),我只能通过电子邮件通知用户,即我无法在用户个人资料中显示这些通知,就像我们在Facebook上.

首先我想知道我是不是错了,然后我真的需要一些适当的教程或指导如何去做.我知道如何注册通知并将其发送到正确的信号,但是没有关于如何在模板中显示这些通知的文档,如果可以的话.

任何指导/教程/入门文档将深表感谢.

python django django-signals django-apps django-notification

11
推荐指数
1
解决办法
1万
查看次数

在django中使用Pre_delete信号

在我的应用程序中,我想跟踪所有正在删除的问题.所以我在我的模型文件中创建了一个类(表).

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信号来填充我创建的新表.

〜新手尝试重大任务〜先谢谢:)

python django django-signals django-models

11
推荐指数
1
解决办法
2万
查看次数

在Django中使用InlineAdmin和post_save信号创建配置文件模型

我创建了一个"配置文件"模型(与用户模型具有一对一的关系),如扩展现有用户模型所述.配置文件模型与另一个模型具有可选的多对一关系:

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) …

python django django-signals django-models django-admin

11
推荐指数
1
解决办法
1919
查看次数

如何从Django迁移中发送信号?

我使用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评论?或者有没有办法从数据迁移中发送信号?

django data-migration django-signals django-migrations

11
推荐指数
1
解决办法
2246
查看次数

如何使用post_delete - Django 1.8从文件系统中删除文件

我有一个模型 - 产品,其中包含缩略图.我有另一个模型,其中包含与产品相关的图像 - 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实例时应用它...

django django-signals django-uploads

11
推荐指数
2
解决办法
1万
查看次数