我有一个通常为空的CharField.mail_managers当字段设置为非空值时,我想向所有管理员发送电子邮件通知(使用).只有通过管理站点才能对此字段进行更改.
我认为这可能是我可以通过信号做的事情,但我没有看到文档中列出的适当信号.有任何想法吗?
我创建了一个信号:
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)
有用.有任何想法吗?
添加或删除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) 我有一个测试 django 应用程序。
在一页中,测试向所有用户显示相同的问题。
我希望当用户正确回答时,向其他活动用户的浏览器发送信号以刷新下一个问题。
我一直在学习 django 中的信号,我正在学习使用它们,但我现在不知道如何将“刷新信号”发送到客户端浏览器。
我认为它可以使用 javascript 代码来检查某个值(实际问题)是否更改,如果更改会重新加载页面,但我不知道这种语言,而且我发现的信息很混乱。
有谁能够帮助我?
非常感谢。
有时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
在我的示例中,信号函数是在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 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_handler它post_save.但是,即使没有保存任何内容,该消息也会出现很多次.我不明白这一点.
注意:我会诚实的.我理解它的一部分,而不是文档中的所有内容.
我有一个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的新手,也许我的问题有一个简单的答案,但我陷入僵局.我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) 我正在尝试在保存应用程序中的 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) django ×10
django-signals ×10
python ×4
django-admin ×1
django-views ×1
page-refresh ×1
signals ×1