有条件地覆盖模型Django admin成功保存了消息

时间:2013-03-27 21:12:54

标签: django django-models django-admin

我在Django模型上覆盖了save方法。在某些情况下,我不保存模型。在这些情况下,我似乎无法弄清楚如何有条件地覆盖“引用1111已成功添加”。返回管理列表界面后显示的消息(与输入表单界面相反)。

1 个答案:

答案 0 :(得分:1)

我不认为你可以通过覆盖save来覆盖它.Django的管理界面使用模型表单和消息框架。

我觉得这样的事情发生了,它比这更复杂但是或多或少:

models.py

class MyModel(models.Model):
    foo = models.CharField(...)
    bar = models.CharField(...)

    def save(self, *args, **kwargs):
        if self.foo == self.bar:  # We only save if foo == bar
            super(MyModel, self).save(*args, **kwargs)

forms.py(Django admin使用模型表单,所以这是一个例子)

class MyModelForm(ModelForm):
    class Meta:
        model = MyModel

views.py

def save(request):
    if request.method == 'POST':
        form = MyModelForm(request.POST)
        if form.is_valid():
            form.save()
            messages.success(request, 'MyModel was saved!.')

现在无论form.save()实际上是什么消息仍然被发送出去,我们无法知道你是否保存了被覆盖的保存方法,这可能是django管理系统中发生的事情。

另一种方法是为管理员创建一个自定义模型表单以用于此模型并定义自定义验证方法,因此除非foo == bar,否则表单不会验证。或者你可以覆盖表单上的save方法,你需要看看django管理代码,它可能是有可能的,只是有点trixy:p