Django Admin-检测内联字段中的更改

时间:2018-06-21 06:23:15

标签: django python-3.x

我对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部分中跟踪更改。

1 个答案:

答案 0 :(得分:0)

我一直在寻找一种适当的解决方案。如果您不是严格希望从Project管理员的save_model()方法中访问更改的内联字段,我可以建议三种解决方案。即使它可能不是最佳解决方案,也可以完成您的工作。

方法1

您可以按以下方式使用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)

方法2

这将要求您使用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()

方法3

您可以使用表格ProjectTopicForm的{​​{1}}方法来访问更改的数据。

forms.py

clean()

我有一个类似的问题here,我一直在寻找解决方法