Django Admin 编辑模型时偶尔返回404

4 投票
3 回答
1614 浏览
提问于 2025-04-16 00:40

我们正在使用Django的管理后台来维护一些数据,这些数据会导出到我们的一些网站上。有时候,当我们在标准的更改列表视图中点击进入模型编辑表单时,反而会被引导到一个Django的404页面。

这种情况有时会发生,我们一度可以通过刷新三次来重现这个问题:

  • 第一次按F5:404
  • 第二次按F5:404
  • 第三次按F5:对象更改表单正常加载

但最近,这种404错误的出现频率似乎更高了。当我们优雅地重启apache时,出现404的几率似乎会降低,而请求越多,问题似乎越严重。

我们在使用Django 1.2.1,搭配Fast-CGI和MySQL 5.1.x。

顺便说一下,我在我的虚拟机上无法重现这个问题,但我在那里的设置中使用了mod_wsgi,并且将Debug设置为True。否则,代码和数据库是完全相同的。

3 个回答

0

看看下面这个链接里的替代WSGI脚本是否有帮助:

http://blog.dscpl.com.au/2010/03/improved-wsgi-script-for-use-with.html

试试这个脚本,看看效果怎么样。

1

我上周也遇到了同样的问题。在追踪这个错误几个月后,我发现是在Django的源代码中出现了404错误。

我修改了这个文件:/path/to/django/contrib/admin/options.py,具体是ModuleAdmin类里的get_object()方法。注意:我使用的是Django 1.3.1。

出于某种原因,Django在查询集中找不到带有主键object_id的对象。所以我把它改成了这样:

def get_object(self, request, object_id):
    ....
    queryset = self.queryset(request)
    model = queryset.model
    obj = None

    #first search the object with original way
    try:
        object_id = model._meta.pk.to_python(object_id)
        obj = queryset.get(pk=object_id)
    except:
        #print "DEBUG: > first try does not exist (%s)" % str(object_id)
        obj = None

    if obj is None: 
        #if object doesn't exist in queryset, search in db
        try:
            object_id = model._meta.pk.to_python(object_id)
            obj = model.objects.get(pk=object_id)
            #print "DEBUG: > second try found %s" % str(obj)
        except (model.DoesNotExist, ValidationError):
            #print "DEBUG: > second try does not exist"
            obj = None
    return obj

我知道直接修改Django的源代码并不是个好主意,所以请自行承担风险!

4

我也遇到过同样的问题。对我来说,解决办法是把我调用 admin.site.register() 的代码移动到 admin.py 文件里。当你把 DEBUG 设置为 false 时,你的模型是懒加载的,这意味着注册的调用不一定会被执行。不过,听说 admin.py 文件在初始化时总是会被加载。

撰写回答