2010-07-01 57 views
4

我們使用Django Admin來維護一些導出到我們幾個網站的數據。有時,當點擊標準變更列表視圖來獲取模型編輯表單而不是路由到正確的頁面時,我們會得到Django 404頁面/模板。Django Admin間歇性地返回404模型編輯

它發生有些sporatically,我們可以有一段由重裝三次重現:

  • 首先F5:404
  • 二F5:404
  • 三F5:對象的變化形式加載正確

但最近它已經返回404往往不是。這似乎減少了當我們反彈Apache(優雅地)並且隨着更多請求變得更糟(再次,看起來)時返回404的可能性。

上快速CGI運行Django 1.2.1/MySQL的5.1.x版

FWIW,我不能重現該問題上我的虛擬機,但我跑mod_wsgi的存在,並在調試=真集設置。否則代碼和數據庫是相同的。

回答

4

我有這個相同的問題。對我來說,解決方案是將我的呼叫移至admin.site.register()admin.py。將DEBUG設置爲false時,您的模型會延遲加載,因此註冊調用並不總是會被完成。然而,顯然admin.py始終是在init時間加載的。

+0

你的admin.site.register()調用會在哪裏?我已經在每個應用程序的admin.py中,但現在只能在帶有apache的產品而不是manage.py runserver中獲得此問題 – radtek 2015-01-01 19:43:00

0

查看是否在結束時的備用WSGI腳本:

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

有差別。

+0

嘗試了替代的wsgi.py腳本,並沒有爲我工作。我得到的404頁面也被破壞,所有靜態圖片都不顯示,翻譯被破壞。其他網址上的404頁面正常工作。 (django 1.6.8和mod_wsgi apache) – radtek 2015-01-02 05:05:25

+0

那篇博文現在已經過時了,不應該使用。從那以後,Django發生了很大的變化。 – 2015-01-03 06:56:04

+0

apache mod_wsgi的行爲與say gunicorn + wsgi不同,所以我只有在mod_wsgi上運行時才遇到這個404問題。問題原來是init之外有條件聲明的對象變量。在Beanstalk中運行的mod_wsgi並不喜歡它,但在其他地方運行良好。這甚至有意義嗎?雖然在我的情況非常具體的問題。 – radtek 2015-01-03 07:18:29

1

直到上週我都有同樣的問題。在我追蹤這個錯誤幾個月後,我發現404在django源代碼中提升。

我修改了ModuleAdmin類的/path/to/django/contrib/admin/options.py get_object()方法的文件。 注:我使用Django 1.3.1

不知何故django無法在queryset中找到包含pk 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的源東西一件好事,所以在使用您自擔風險!