【问题标题】:Django: How to check that an inline action has been executed?Django:如何检查内联操作是否已执行?
【发布时间】:2021-09-09 04:05:59
【问题描述】:

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

在我的 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 中保存一个保持状态的变量吗?我阅读了指示 in this solution 的 ValidationError,但我很困惑,因为我想验证内联操作(函数)而不是表单字段。

【问题讨论】:

    标签: django


    【解决方案1】:

    所有操作都是完全独立的请求,理论上可以分隔任意时间。这是 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-03
      • 1970-01-01
      • 2021-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多