我对python很陌生。我有名为Project和ProjectTopic的模型。
class Project(models.Model):
name = models.CharField(max_length=250)
description = models.TextField()
class ProjectTopic(models.Model):
project = models.ForeignKey(Project, on_delete=models.CASCADE)
title = models.CharField(max_length=250)
在admin.py中,我添加了ProjectTopic作为内联字段。管理员可以添加自己喜欢的主题。
现在的要求是,如果项目中包含ProjectTopic部分的任何更改,我都需要发送通知。我已添加
def save_model(self, request, obj, form, change):
if 'description' in form.changed_data:
send_notification()
super().save_model(request, obj, form, change)
但是不知道如何在嵌入式ProjectTopic部分中跟踪更改。
答案 0 :(得分:0)
我一直在寻找一种适当的解决方案。如果您不是严格希望从Project
管理员的save_model()
方法中访问更改的内联字段,我可以建议三种解决方案。即使它可能不是最佳解决方案,也可以完成您的工作。
您可以按以下方式使用save_related()
方法
def save_related(self, request, form, formsets, change):
if form.changed_data:
# Call function to notify change in Project fields
send_project_notification()
for form_set in formsets:
if form_set.has_changed():
# Call function to notify change in ProjectTopic fields
send_project_topic_notification()
super().save_related(request, form, formsets, change)
这将要求您使用Field Tracker来跟踪模型字段中的更改。将project_topic_tracker
添加到模型中,并使用post_save
信号跟踪更改,如下所示。
models.py
class ProjectTopic(models.Model):
project = models.ForeignKey(Project, on_delete=models.CASCADE)
title = models.CharField(max_length=250)
project_topic_tracker = FieldTracker()
signals.py
@receiver(post_save, sender=ProjectTopic)
def notify_project_topic_change(sender, **kwargs):
if 'instance' in kwargs:
instance = kwargs['instance']
if(
hasattr(instance, 'project_topic_tracker') and
instance.project_topic_tracker.changed()
):
changed_list = list(instance.project_topic_tracker.changed().keys())
if changed_list:
# Call your notification function
send_project_topic_notification()
您可以使用表格ProjectTopicForm
的{{1}}方法来访问更改的数据。
forms.py
clean()
我有一个类似的问题here,我一直在寻找解决方法