Skip to main content
 首页 » 编程设计

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

2024年08月23日28Leo_wl

我在使用 Django 的管理系统时遇到了一个奇怪的问题,它覆盖了 add_view 和 change_view 方法以显示用于添加和更改数据的不同字段。添加 View 在显示更改 View 之前完美运行,然后在尝试添加新数据时它将始终显示更改 View 而不是添加 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) 

我已禁用所有第 3 方应用程序,只使用 DummyCache。在显示更改 View 后再次显示添加 View 的唯一方法是重新启动站点。我检查过它是否正确调用了 add_view 方法,它只是在那之后的某个时候出错并显示了 change_view。

我假设这不是一个错误,否则会有其他人提示它,所以我一定是做错了什么,但我看不出它是什么。

谢谢,

保罗

请您参考如下方法:

像这样修改 self.fields、self.fieldsets 和 self.readonly_fields 是不安全的。您正在为 future 的请求以及当前的请求更改它们。

无需在 add_view 和 change_view 方法中修改这些属性,您可以覆盖 get_fields , get_fieldsets , 和 get_readonly_fields反而。如果 obj 为 None,那么您正在添加一个对象。例如:

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