标签: django-signals

通过管理站点修改Django CharField时发送电子邮件通知

我有一个通常为空的CharField.mail_managers当字段设置为非空值时,我想向所有管理员发送电子邮件通知(使用).只有通过管理站点才能对此字段进行更改.

我认为这可能是我可以通过信号做的事情,但我没有看到文档中列出的适当信号.有任何想法吗?

django django-signals django-admin

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

自定义信号不起作用

我创建了一个信号:

sig_published = Signal()
Run Code Online (Sandbox Code Playgroud)

此信号放在signals.py中,我在models.py中导入:

from signals import sig_published
Run Code Online (Sandbox Code Playgroud)

在模型文件的页脚中,我将它连接到一个函数,为了测试目的,只打印出一个调试字符串:

def update_mode(sender, **kwargs):
    print "UPDATING"
sig_published.connect(update_mode, sender=MyModel)
Run Code Online (Sandbox Code Playgroud)

现在,在我的save() - Method中,我尝试发送一个信号:

sig_published.send(sender=self)
Run Code Online (Sandbox Code Playgroud)

但它没有打印出任何东西.如果我尝试像pre_save这样的内置信号:

pre_save.connect(update_mode, sender=MyModel)
Run Code Online (Sandbox Code Playgroud)

有用.有任何想法吗?

django django-signals

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

如何检测添加/删除Django模型的对象?

添加或删除Foo类型I的对象时,需要进行相同的计算.如何检测Foo模型对象的添加/删除?例如:

from django.db import models

class Foo(models.Model):
    ...
    def save(self):
        #do some processing

    def delete(self):
        #do some processing
Run Code Online (Sandbox Code Playgroud)

我可以避免这两种方法中的代码重复吗?

使用信号你可以实现它

from django.db import models 
from django.db.models.signals import post_save, post_delete

class Foo(models.Model):
    ...
    ...

def foo_handler(sender, **kwargs):    
    #do some processing 

post_save.connect(foo_handler, sender=Foo)
post_delete.connect(foo_handler, sender=Foo)    
Run Code Online (Sandbox Code Playgroud)

python django django-signals django-models

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

如果其他用户更改数据,Django 刷新页面

我有一个测试 django 应用程序。

在一页中,测试向所有用户显示相同的问题。

我希望当用户正确回答时,向其他活动用户的浏览器发送信号以刷新下一个问题。

我一直在学习 django 中的信号,我正在学习使用它们,但我现在不知道如何将“刷新信号”发送到客户端浏览器。

我认为它可以使用 javascript 代码来检查某个值(实际问题)是否更改,如果更改会重新加载页面,但我不知道这种语言,而且我发现的信息很混乱。

有谁能够帮助我?

非常感谢。

django django-signals page-refresh

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

django信号.如何创建一个独特的调度ID?

有时django中的信号会被触发两次.在文档中,它说创建(唯一)的好方法dispatch_uid是模块的路径或名称[1]或任何可散列对象的id [2].

今天我试过这个:

import time
my_signal.connect(my_function, dispatch_uid=str(time.time()))
Run Code Online (Sandbox Code Playgroud)

但是我担心在多用户环境中(例如在网站的情况下).这可能会被打破.在多用户环境中创建此类ID的有效且安全的方法是什么?

[1] https://code.djangoproject.com/wiki/Signals

[2] https://docs.djangoproject.com/en/dev/topics/signals/#preventing-duplicate-signals

django django-signals

2
推荐指数
2
解决办法
2916
查看次数

Django使用自定义信号发送邮件

在我的示例中,信号函数是在models.py中创建的.相对于此,我认为可以使用自定义信号概念.

我的models.py用于信号功能

class Book(models.Model):
    [..........]

def send_update(sender, instance, created, **kwargs):
    if instance.author_name:
        message = "Book is updated"
        subject = "Updates"
        send_mail(subject, message, your_email,
            [instance.email,])

post_save.connect(send_update, sender=Book)
Run Code Online (Sandbox Code Playgroud)

views.py是

if request.POST:
        form = BookForm(request.POST)

        if form.is_valid():
            cd = form.cleaned_data
            form.save()
            return redirect('/index/')
    return render_to_response('addbook.html',{ 'form':form },context_instance=RequestContext(request))
Run Code Online (Sandbox Code Playgroud)

而不是这个我们如何使用signals.py文件创建自定义信号来发送邮件.

我试图在实践中学习这个,一个例子将帮助我做到这一点.

谢谢

django django-signals django-views

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

无法使post_save在Django中工作

我阅读了django docs关于signals并为我的模型编写了这段代码Car:

@receiver(request_finished)
def signal_callback(sender, **kwargs):
    print 'Save Signal received'


@receiver(post_save, sender=Car)
def signal_handler(sender, **kwargs):
    pass


request_finished(signal_callback, sender=car, dispatch_url="Unique save id")
Run Code Online (Sandbox Code Playgroud)

但问题是,当我启动我的服务器,并打开管理员时,我'Save Signal received'在终端中获得了很多.我想知道的是我只限制了signal_handlerpost_save.但是,即使没有保存任何内容,该消息也会出现很多次.我不明白这一点.

注意:我会诚实的.我理解它的一部分,而不是文档中的所有内容.

python django django-signals

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

Django 跨应用程序接收信号

我有一个main_app, 和app2. main_app本质上是带有数据的项目列表,并且app2具有有关所述项目的更多信息。

main_app不应该知道app2,但app2可以从 导入main_app

之内main_app/signals.py,我有

import django.dispatch
mysignal = django.dispatch.Signal(providing_args=['uid'])
Run Code Online (Sandbox Code Playgroud)

在 中main_app/views.py,我有一个呈现各种视图main_templates,其中包含项目的详细信息,一个用于编辑的视图,以及一个用于提交所述编辑数据的视图。这个想法是,当每个信号被调用并接收到该信号时,app2就会发送一个信号。main_template使用“ with”调用来获取template2该应用程序的信息。

app2/processes.py我有以下内容:

import django.dispatch
from django.dispatch import receiver
import my models
from main_app.signals import mysignal, (mysignal2, etc)
Run Code Online (Sandbox Code Playgroud)

然后对于每个方法,我有

@receiver(mysignal)
def foo(sender, **kwargs) etc
Run Code Online (Sandbox Code Playgroud)

好的...所以,在 中main_app/views.py,如果我有以下行:

from app2.processes import mysignal, mysignal2 etc
Run Code Online (Sandbox Code Playgroud)

一切都很顺利。但我想消除对app2in的任何依赖main_app。就我而言, …

django django-signals

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

尽管在ready()方法中连接,Django信号接收器仍然无法工作

我是Django的新手,也许我的问题有一个简单的答案,但我陷入僵局.我signals.py使用的是我的信号代码@receiver.根据文件,我在ready()中输入了信号子模块apps.py.但它不起作用=(任何人都可以帮助我吗?

NB如果我在内部编写信号代码,models.py一切运行良好.

码: signal.py

from django.db.models.signals import post_delete
from django.dispatch import receiver
import os
from .models import ProductImage

def delete_image_from_storage(path):
  if os.path.isfile(path):
     print(path)
     os.remove(path)


@receiver(post_delete, sender=ProductImage)
def post_delete_image(sender, instance, **kawargs):
  if instance.photo:
      print(instance.photo.path)
      delete_image_from_storage(instance.photo.path)
Run Code Online (Sandbox Code Playgroud)

apps.py

from django.apps import AppConfig


class ProductsConfig(AppConfig):
  name = 'products'

  def ready():
      import products.signals
Run Code Online (Sandbox Code Playgroud)

settings.py

INSTALLED_APPS = [
    ...,
    'products',
    ...,
]
Run Code Online (Sandbox Code Playgroud)

python django django-signals

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

放置在models.py之外时Django信号不起作用

我正在尝试在保存应用程序中的 Django 模型后打印一些文本。

我在同一个应用程序的signals.py 文件中为此创建了一个信号。

但是,它没有按预期工作(即,没有调用该函数并且没有打印文本)

但是,如果我将接收器函数放在我创建的模型正下方的 models.py 文件中,它就可以正常工作(即,正在调用该函数并打印文本)

我已经阅读了文档以检查是否需要将信号放置在特定文件或位置中。好像没有这样的限制。

https://docs.djangoproject.com/en/3.0/topics/signals/#django.dispatch.receiver

如果没有这样的限制,为什么这种行为会有所不同?

信号.py:

from django.db.models.signals import post_save
from django.dispatch import receiver
from aws_envs.models import UserStack

@receiver(post_save, sender=UserStack)
def create_user_stack(sender, **kwargs):
    print("creating user stack now")
Run Code Online (Sandbox Code Playgroud)

模型.py:

class UserStack(BaseModel):

    name = models.CharField(max_length=50)
    email = models.EmailField(unique=True, max_length=50, blank=False)
    enabled = models.BooleanField(default=True)

    def save(self, *args, **kwargs):
        print(f"Creating stack with data: {self.name, self.email}")
        super(UserStack, self).save(*args, **kwargs)

    def __str__(self):
        return self.name, self.email
Run Code Online (Sandbox Code Playgroud)

python django signals django-signals django-models

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