标签: django-signals

为什么我的信号在 Django 中不起作用 - 我做错了什么?

首先,我不是开发人员。

尝试使用 Django(版本 3.1.2)构建应用程序,但遇到一些信号问题。

我的模型中有这个模型models.py

class PhoneNumbers(models.Model):
    number = models.CharField(_('Category'), max_length=255)
    created = models.DateTimeField(_('Created'), auto_now_add=True, blank=True)
    uuid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True)
Run Code Online (Sandbox Code Playgroud)

和一个模型Persons

class Persons(models.Model):
    name = models.CharField(_('Name'), max_length=255)
    number = models.CharField(_(Number), max_length=255)
    ...
Run Code Online (Sandbox Code Playgroud)

我的代码signals.py

from django.db.models.signals import pre_save, post_delete, post_save
from django.dispatch import receiver
from .models import PhoneNumbers, Persons

@receiver(post_save, sender=Persons)
def save_contract(instance, sender, created, **kwargs):
    print("Request finished!")
Run Code Online (Sandbox Code Playgroud)

当我保存一个人时,我希望在控制台输出中得到打印,但什么也没得到。怎么了?

我还添加__init__.py

default_app_config = 'myapp.apps.MyAppConfig'
Run Code Online (Sandbox Code Playgroud)

我的 apps.py 看起来像:

from django.apps import AppConfig


class MyAppConfig(AppConfig):
    name …
Run Code Online (Sandbox Code Playgroud)

python django django-signals

4
推荐指数
1
解决办法
2802
查看次数

如何在保存一次后将模型实例设为只读?

我写的Django项目的一个功能是发送简报.我有一个模型,Newsletter以及一个功能,send_newsletter,我已经注册收听Newsletterpost_save信号.通过管理界面保存新闻稿对象时,send_newsletter检查是否created为True,如果是,则实际发送邮件.

但是,由于显而易见的原因,编辑已发送的简报并没有多大意义.有没有一种方法Newsletter可以在保存对象后使其成为只读对象?

编辑:

我知道我可以覆盖save对象的方法来引发错误,或者如果对象存在则不要.但是,我没有看到这样做的意义.至于前者,我不知道在哪里捕获该错误以及如何向用户传达该对象未被保存的事实.至于后者,给用户提供错误的反馈(管理界面说保存成功)似乎不是一件好事.

我真正想要的是允许用户使用Admin界面编写新闻稿并发送它,然后浏览已经发送的新闻稿.我希望管理界面在不可编辑的输入框中显示已发送简报的数据,而不使用"保存"按钮.或者,我希望"保存"按钮不活动.

python django django-signals django-models django-admin

3
推荐指数
1
解决办法
1134
查看次数

调试django信号的问题

我在连接django中的信号时遇到问题.我一直在关注http://dmitko.ru/?p=546上提供的教程,并尝试扩展用户注册.

我已经正确设置了django-registration.它工作正常.出于调试目的,我将以下代码放入我的urls.py中:

from registration.signals import user_registered

def log_user_created(sender, user, request, ** kwargs):
  logger.debug("got USER_REGISTERED signal")

if settings.DEBUG:
  logger.debug("registering debug signal listeners")
  user_registered.connect(log_user_created)
else:
  logger.debug("debuging signals not enabled")    
Run Code Online (Sandbox Code Playgroud)

但是永远不会调用log_user_created函数.

我的问题是:如何调试我的应用程序以查看吞下user_registered信号的位置?

注意:我已经检查过我的django-registration版本是否正常工作.我已将我的版本改为上述博客示例应用程序中的版本.它没有改变观察到的行为.

django django-signals django-registration

3
推荐指数
1
解决办法
2928
查看次数

使用Django信号的正确案例

我有一个全球性问题和一个关于信号背景下特定问题的问题.为了解决这些问题,信号调度员最有用,是否过度?

我有一个使用外键保存多个模型的问题.我认为这个信号可以解决它.但我不知道如何,因为我不明白信号的范围.

模型

class CV(models.Model):
    title = models.CharField(max_length=255)
    # And other fields...

class HigherEducation(models.Model):
    cv = models.ForeignKey(CV, blank=True, null=True)
    institution = models.CharField(max_length=255)
    # And other fields...

class ProfessionalExperience(models.Model):
    cv = models.ForeignKey(CV, blank=True, null=True)
    company_name = models.CharField(max_length=255)
    # And other fields...
Run Code Online (Sandbox Code Playgroud)

所有表单都是从上面的模型继承的模型.最后两个用于modelformsets.所有这些表单都以模板中的一个html格式显示.

形式

class CVForm(forms.ModelForm):
    class Meta:
        # All the stuff

class EducationForm(forms.ModelForm):
    class Meta:
        # All the stuff

class ExperienceForm(forms.ModelForm):
    class Meta:
        # All the stuff

Education = modelformset_factory(HigherEducation, 
                                 form=EducationForm,
                                 max_num=2)
Experience = modelformset_factory(ProfessionalExperience,
                                  form=ExperienceForm,
                                  max_num=1)
Run Code Online (Sandbox Code Playgroud)

在视图中,我需要使用当前模型的指定ID 保存EducationForm …

django django-signals

3
推荐指数
1
解决办法
1692
查看次数

如何在Django中安排任务?

在Django安排工作的最佳方法是什么.我的目标是根据用户的独立设置(如每日,每周,每月)向用户发送余额报表PDF电子邮件.如何进行检查?请指教我是Django和python世界的新手.我使用WindowsXP,python 2.7.2,Django 1.3.1和MS-SQL2008谢谢

python django django-signals django-views django-settings

3
推荐指数
1
解决办法
2114
查看次数

使用Django Rest Framework和Angular从API端点发送电子邮件

一旦POST成功完成,我想发送电子邮件.似乎有意义的是,电子邮件将通过信号完成.我可以自己编写,如下所示:https://docs.djangoproject.com/en/1.6/topics/signals/#defining-and-sending-signals

但是,我无法弄清楚的是:

  1. Django Rest Framework是否支持信号(为什么不是它,它只是Django)
  2. 我该怎么发送自定义信号?发件人是什么?

建议欢迎.

还有,有人用Angular这样做吗?有没有一种简单的方法可以做到这一点,我没有看到?

django django-signals angularjs django-rest-framework

3
推荐指数
1
解决办法
4722
查看次数

保存时检查以前的型号值

我有一个保存游览的模型.用户可以改变这次短途旅行,但我需要知道这次短途旅行之前的变化,因为我会记录每次短途旅行的"预订"次数,如果你改变了短途旅行,我需要删除一次预订.以前的游览.

我不完全确定应该怎么做.

我猜你用这个信号了吗?

我应该使用pre_save,pre_init还是最好用的?

pre_save看起来不正确,因为它打印新值,而不是我预期的"旧值"

@receiver(pre_save, sender=Delegate)
def my_callback(sender, instance, *args, **kwargs):
    print instance.excursion
Run Code Online (Sandbox Code Playgroud)

django django-signals django-models

3
推荐指数
1
解决办法
3815
查看次数

在Django中检测更改的密码

当用户更改密码时,我想发送一个信号,以便我可以在某些型号上做一些事情.

我该如何创建此信号?

我查看post_save了用户的信号:

post_save.connect(user_updated, sender=User)
Run Code Online (Sandbox Code Playgroud)

但是,我似乎没有任何东西可以检查密码是否已更改:

def user_updated(sender, **kwargs):
    print(kwargs) # {'created': False, 'raw': False, 'instance': <User: 100002>, 'update_fields': None, 'signal': <django.db.models.signals.ModelSignal object at 0x7ff8862f03c8>, 'using': 'default'}
Run Code Online (Sandbox Code Playgroud)

我也看到有一个password_change_doneauth视图,但我不确定我是如何使用它的.https://docs.djangoproject.com/en/1.10/topics/auth/default/#built-in-auth-views

有任何想法吗?

python django django-signals django-authentication

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

ValueError:信号接收器必须接受关键字参数 (**kwargs)。使用 Haystack 时

我正在尝试按照 haystack 文档制作 SignalProcessor,这是我的代码:

from haystack.signals import RealtimeSignalProcessor
from products.models import ProductCreateModel
from django.db import models
from star_ratings.models import Rating

class BatchingSignalProcessor(RealtimeSignalProcessor):

   def handle_save(self):
        using_backends = self.connection_router.for_write(instance=instance)

        for using in using_backends:
            try:
                index = self.connections[using].get_unified_index().get_index(instance.__class__)
                index.update_object(instance, using=using)
            except NotHandled:
                # TODO: Maybe log it or let the exception bubble?
                pass


    def setup(self):
        models.signals.post_save.connect(self.handle_save, sender=Rating)
Run Code Online (Sandbox Code Playgroud)

完整错误:

Unhandled exception in thread started by <function check_errors.<locals>.wrapper at 0x00000240811ED400>
Traceback (most recent call last):
  File "C:\Users\lenovo\AppData\Local\conda\conda\envs\myDjangoEnv\lib\site-packages\django\utils\autoreload.py", line 225, in wrapper
    fn(*args, **kwargs)
  File "C:\Users\lenovo\AppData\Local\conda\conda\envs\myDjangoEnv\lib\site-packages\django\core\management\commands\runserver.py", …
Run Code Online (Sandbox Code Playgroud)

django django-signals django-models python-3.x

3
推荐指数
1
解决办法
2754
查看次数

Django 中的 clean 方法之前是否处理了预保存信号?

我找不到它的参考。老实说,这个问题是不言自明的。在 Django 表单中,例如管理表单,在保存之前会自动调用 clean 方法。我的问题是,如果我有一个方法作为预保存信号,哪个会先执行?

django django-signals django-forms

3
推荐指数
1
解决办法
1344
查看次数