Django admin add_view仅在第一次显示change_view之前呈现

时间:2016-03-31 10:47:58

标签: python django modeladmin

我遇到了Django管理系统的一个奇怪问题,并覆盖了add_view和change_view方法,以显示添加和更改数据的不同字段。添加视图完美地运行,直到显示更改视图,然后在尝试添加新数据时,它将始终显示更改视图而不是添加视图。我正在使用Django 1.9.4的最新版本。我的ModelAdmin类非常简单:

@admin.register(Trigger)
class TriggerAdmin(admin.ModelAdmin):
    def add_view(self, request, **kwargs):
        self.fields = ('name', 'modules', 'trigger_event')
        self.filter_horizontal = ('modules',)
        return super(TriggerAdmin, self).add_view(request, **kwargs)

    def response_add(self, request, obj, **kwargs):
        return HttpResponseRedirect("../%s" % obj.id)

    def change_view(self, request, object_id, **kwargs):
        self.fieldsets = (
            (None, {'fields': ('name', 'modules')}),
            (_('Trigger'), {'fields': ('trigger_event', 'query', 'actions', 'is_active')})
        )
        self.readonly_fields = ('modules', 'trigger_event')
        return super(TriggerAdmin, self).change_view(request, object_id, **kwargs)

我已禁用所有第三方应用,并且仅使用DummyCache。在显示更改视图后,再次显示添加视图的唯一方法是重新启动站点。我已经检查过它是否正确调用了add_view方法,它在之后的某个时刻出错,并显示了change_view。

我认为这不是一个错误,否则会有其他人抱怨它,所以我一定做错了,但我看不出它是什么。

谢谢,

1 个答案:

答案 0 :(得分:3)

像这样修改self.fieldsself.fieldsetsself.readonly_fields是不安全的。您正在为将来的请求以及当前请求更改它们。

您可以改写get_fieldsget_fieldsetsget_readonly_fields,而不是在add_viewchange_view方法中修改这些属性。如果obj为None,则表示您正在添加对象。例如:

def get_fields(self, request, obj=None):
    if obj is None:
        return [<fields for add view>]
    else:
        return [<fields for change view>]