【问题标题】:How do something when i change a field on the django admin for a model当我在 django admin 上更改模型的字段时该怎么做
【发布时间】:2019-11-28 19:59:00
【问题描述】:

我目前在模型上有一个名为“is_active”的布尔字段。每当我在 django 管理员中手动将此字段设置为 True(最初它是错误的)时,我希望它执行某个操作。 当设置为 true 时,如何在 django 上触发此字段以执行此特定操作?

我听说过 save_model() 方法,但我不知道它是如何工作的。

class Company(models.Model):
    name = models.CharField(max_length=100, unique=True)
    is_active = models.BooleanField(default=False)

    def __str__(self):
        return self.name

【问题讨论】:

    标签: django django-models django-views django-admin


    【解决方案1】:

    您确实可以覆盖ModelAdmin 中的save_model(..) method [Django-doc]form 参数包含模型管理中的Form,您可以检查.changed_data [Django-doc] 以检查值是否更改:

    from app.models import Company
    from django.contrib import admin
    
    class CompanyAdmin(admin.ModelAdmin):
    
        def save_model(self, request, obj, form, change):
            field = 'is_active'
            super().save_model(request, obj, form, change)
            if change and field in form.changed_data and form.cleaned_data.get(field):
                # ... do a certain action
                pass
    
    admin.site.register(Company, CompanyAdmin)

    【讨论】:

    • 感谢您的回复,当我尝试此操作时出现此错误:save_model() 需要 5 个位置参数,但给出了 6 个
    • @Reda:对不起,我打错了:self 已经隐式传递了。所以在super().save_model(...) 调用中,self, 应该被移除。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-20
    • 2020-01-28
    • 1970-01-01
    • 2011-08-14
    • 1970-01-01
    • 1970-01-01
    • 2018-11-30
    相关资源
    最近更新 更多