首页 > 解决方案 > Django:如何检查内联操作是否已执行?

问题描述

我有三个操作,碰巧我必须修复此代码,以便应用程序确保或至少警告用户(仍在定义中)他们跳过了一个步骤。

在我的 admin.py 中,我有三个内联操作:

actions = [clean_data, rel_from_db, send_production]

他们只是以这种方式运行与数据库相关的操作:

def send_production(modeladmin, request, queryset):
for qs in queryset:
    qs.clean_data()

我怎样才能停止执行(在循环之前)以确保执行了前面的两个步骤?我可以在 admin.py 中保存一个保持状态的变量吗?我阅读了此解决方案中指示的 ValidationError ,但我很困惑,因为我想验证内联操作(函数)而不是表单字段。

标签: django

解决方案


所有操作都是完全独立的请求,理论上可以分隔任意时间。这是 Web 服务器的无状态模型的结果。您将需要跟踪模型中的状态并根据其状态进行验证。例如:

class MyModel(models.Model):
    NEW = 'new'
    CLEANED = 'cleaned'
    SEND = 'send' # etc, add more states if needed

    state = models.CharField(choices=((NEW, NEW), (CLEANED, CLEANED), (SEND, SEND)), max_length=50, default=NEW)

def send_production(modeladmin, request, queryset):
    if queryset.exclude(state=MyModel.CLEANED).exists():
        self.message_user(request, 'Some of the selected objects are not cleaned yet', messages.ERROR)
        return

    for qs in queryset:
        qs.send_to_production()  # changes .state to MyModel.SEND

推荐阅读