我创建了一个应用程序,用户可以在其中发布问题并从其他用户那里获取答案。现在我想实现一个通知系统,这样当用户回答问题时,该问题的作者就会收到通知。就像社交媒体通知一样。
主页模板:
<div class="container">
<div class="row justify-content-center">
<div class="row justify-content-center">
<div class="col-md-6">
<a href="{% url 'question' %}" class="btn btn-primary m-1">Ask Question</a>
<a href="{% url 'notification' %}" class="btn btn-primary m-1">Notifications</a>
<a href="{% url 'FeedBack' %}" class="btn btn-primary m-1">FeedBack</a>
<a href="{% url 'login' %}" class="btn btn-primary m-1">Log Out</a>
</div>
</div>
</div>
</div>
<div class="container">
<div class="row justify-content-center">
{% for question in list_of_question reversed %}
<div class="col-md-4">
<div class="card my-3">
<div class="card-header">
<p class="card-title">{{question.user.username.upper}}</p>
</div>
<div class="card-body">
<a href="{% url 'view-Question' question.id %}" …Run Code Online (Sandbox Code Playgroud) 我很难从django掌握这个post_save/pre_save信号.
发生的事情是我的模型有一个被调用的字段status,当添加/保存该模型的条目时,它的状态必须在某些条件下相应地改变.
我的模型看起来像这样:
class Ticket(models.Model):
(...)
status = models.CharField(max_length=1,choices=OFFERT_STATUS, default='O')
Run Code Online (Sandbox Code Playgroud)
我的信号处理程序,配置为pre_save:
def ticket_handler(sender, **kwargs):
ticket = kwargs['instance']
(...)
if someOtherCondition:
ticket.status = 'C'
Run Code Online (Sandbox Code Playgroud)
现在,如果我把ticket.save()这个最后一行if声明放在一个巨大的迭代黑洞中会发生什么,因为这个动作会调用信号本身.而且这个问题都发生在pre_save和post_save.
嗯...我想在django的宇宙中,在保存它之前(甚至之后)改变条目的能力是很常见的.那么,我在这里做错了什么?信号是错误的方法还是我错过了其他的东西?
此外,一旦触发了pre_save/post_save函数,是否有可能访问另一个模型的实例并更改其中的特定行条目?
谢谢
我有一个与Catalog模型具有OnetoOne关系的Article模型.
我当前的功能有Article模型,在post_save上创建一个具有相同名称的Catalog模型.我想做另一个功能,其中Article FK从null变为更新到现在可用的同名Catalog实例.
这是我到目前为止:
class Catalog(models.Model):
name = models.CharField(max_length=100)
price = models.IntegerField()
def __unicode__(self):
return self.name
class Article(models.Model):
catalog = models.OneToOneField(Catalog, related_name='article_products', blank=True, null=True)
title = models.CharField(max_length=200)
def __unicode__(self):
return unicode(self.title)
@receiver(post_save, sender=Article)
def create_catalog(sender, **kwargs):
if kwargs.get('created', False):
Catalog.objects.get_or_create(name=kwargs.get('instance'), price='10')
Run Code Online (Sandbox Code Playgroud)
上面的代码工作正常.创建Article模型实例后,它将创建同名的Catalog实例.我现在想要将新创建的文章与FK关系更新为新创建的Catalog实例.我认为我的逻辑很接近,但我无法让它发挥作用.
@receiver(post_save, sender=Catalog)
def attach_catalog(sender, **kwargs):
if kwargs.get('created', False):
Article.objects.latest('id').update(catalog=kwargs.get('instance'))
Run Code Online (Sandbox Code Playgroud) @receiver(post_save, sender=StudentActionModel)
def save_student_activity(sender, instance, **kwargs):
# update the model object with some info from the request object
instance.came_from = request.REQUEST.get('request_came_from')
instance.save()
Run Code Online (Sandbox Code Playgroud)
用户故事:用户单击某处,我们正在记录他的行为。我们可以以某种方式获得对原始请求对象的访问权限,以便我们能够从中提取一些必需的信息吗?
要注意的是:我们无法更改StudentActionModel代码,我们正在为原始Django应用程序编写插件,并且无法更改任何原始代码。我们只是为“ post_save”信号定义一个监听器,我们需要来自原始请求对象的数据。
我正在点击常见的"模型尚未加载"错误,这个错误来自于导入我的应用程序的单独信号文件models.py.我找到了2个关于如何创建AppConfig并在ready()函数中导入信号的简单指南,但我无法使其工作.我正在使用这里的顶部答案以及此博客文章.
部分原因可能是因为我的整个项目都有一个名称,funproj并且大部分代码所在的主应用程序被有效地调用app- 我正在使用Visual Studio和Python Tools for VS并且它生成了这个结构当我创建项目时.这是层次结构:
funproj
|--- __init__.py
|--- setttings.py
|--- urls.py
|
|--app
| |--- __init__.py
| |--- models.py
| |--- signals.py
|
|--otherapp
| |--- __init__.py
| |--- other stuff
Run Code Online (Sandbox Code Playgroud)
这是缩写,但我已尝试在两者之下放置所需的apps.py相关代码,但两种方法都不起作用.这就是我对每一个人的看法:__init.py__funprojapp
apps.py
from django.apps import AppConfig
class FunProjAppConfig(AppConfig):
name = 'app'
def ready(self):
from app import signals
Run Code Online (Sandbox Code Playgroud)
__init.py__补充
#import signals in the app config
default_app_config = 'app.apps.FunProjAppConfig'
Run Code Online (Sandbox Code Playgroud)
app因为它包含了需要加载的信号,所以有了这个代码对我来说更有意义,但是我链接的例子对我来说并不清楚.一个人提到'app目录',但我不确定这是否真的意味着app,或者他们是否正在使用app作为项目的同义词. …
我想找出什么时候连接到我的Django数据库,或重新启动我的Django服务器.我找到了connection_created Django信号.描述是:
数据库包装器与数据库建立初始连接时发送.如果您要将任何后连接命令发送到SQL后端,这将特别有用.
所以我认为使用这个信号对我的情况来说是一个很好的解决方案.我想在建立连接后运行一个函数.我找不到关于此信号用例的任何文档.connection_created.connect可能是使用的功能.这个函数在一堆参数,但有相关的的有 self,receiver,sender和weak.有谁知道如何使用这些参数和这个函数在新的连接实例上运行我的函数?
此外,如果除了这个信号之外还有任何其他解决方案,我很乐意听到它们.
当一个字段发生变化时,我需要做一些动作.
由于此操作需要使用已保存的对象,我不能使用这样的pre_save信号:
@receiver(pre_save, sender=reservation_models.Reservation)
def generate_possible_pairs(sender, instance, **kwargs):
try:
reservation_old = sender.objects.get(pk=instance.pk)
except sender.DoesNotExist:
pass # Object is new, so field hasn't technically changed, but you may want to do something else here.
else:
if not reservation_old.datetime == instance.datetime: # Field has changed
do_something(instance) # It would be better to be sure instance has been saved
Run Code Online (Sandbox Code Playgroud)
是否有可能使用post_save信号?
我想避免为此模型添加临时属性.
我有一个模型A,其中有一个名为的字段name。如何获取pre_save信号中的先前值和新值?
@receiver(pre_save, sender=A)
def signal_product_manage_latest_version_id(
sender, instance, update_fields=None, **kwargs):
if 'name' in update_fields:
print(instance.name)
Run Code Online (Sandbox Code Playgroud)
name当我调用以下代码时,是旧值还是新值?
a = A.objects.create(name="John")
a.name = "Lee"
a.save()
Run Code Online (Sandbox Code Playgroud) 我有以下 Django 信号,当保存新记录时,它基本上会触发信号将我的 postgres db 中先前记录的点增加 5,但我的 Django 信号将更改保存到 1 条先前记录,并且出现错误RecursionError: Maximum recursion depth exceeded
# models.py
from django.db.models.signals import post_save
class Task(models.Model):
....
def update_points(sender, instance, **kwargs):
qs = Task.objects.filter(status='Active')
for task in qs:
task.points = task.points + 5
task.save()
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?插入新记录后,我使用 .save() 方法将更新的记录保存在数据库中。
我正在尝试解决以下问题。我有 django 视图,它提供在数据库中保存对象的功能。查看将保存对象后,我想立即处理保存的对象上的一些逻辑(例如检查某些字段与另一个对象的相似性)
我听说 django 信号特别是关于 post_save 信号,我认为这适合我的用例。但对于我的用例,我需要传递启动 post_save 信号执行的对象 ID。django 中是否存在任何内置解决方案来提取该对象 ID,以进一步将其传递给信号函数的接收者
希望我的伪代码能够提供更多的证明
app_view(receive and save data as django model object)
post_save signal(receiver, id_of_object_initiated_execution)
Run Code Online (Sandbox Code Playgroud) 我有一段代码抛出错误:
TypeError: 'ModelSignal' object is not callable。
当我要在项目中添加信号时,出现了此错误。为什么会出现这种类型的错误呢?您需要知道什么才能给出我的答案?
请帮助我。我是 Django 的新手。提前致谢。
这是我的views.py 文件:
def registerPage(request):
form = CreateUserForm()
if request.method == "POST":
form = CreateUserForm(request.POST)
if form.is_valid():
user =form.save()
username = form.cleaned_data.get('username')
messages.success(request, 'Account successfully created for ' + username)
return redirect ('login')
context = {'form': form}
return render(request, 'accounts/register.html', context)
Run Code Online (Sandbox Code Playgroud)
我的 models.py 文件:
from django.db import models
from django.contrib.auth.models import User
class Student(models.Model):
user = models.OneToOneField(User, null=True, blank=True, on_delete=models.CASCADE)
name = models.CharField(max_length=200)
phone = models.CharField(max_length=200, null=True)
email = …Run Code Online (Sandbox Code Playgroud) 我想在用户登录我的网站后执行一项或多项功能。这怎么可能?我研究了中间件。Djangobook 说我需要它来对 Django 处理的每个请求运行一段代码。但是,我只需要在身份验证成功时运行代码。
注意:我使用 Django Allauth 进行身份验证,但我没有自己的任何视图来登录用户。
django django-middleware django-signals django-authentication django-allauth
django ×12
django-signals ×12
python ×5
django-3.0 ×1
django-orm ×1
django-views ×1
typeerror ×1