Django常見出錯解決方案彙總

pythontab發表於2014-01-10

一、模板型別錯誤:

錯誤原因:在models中漏掉了return:

class UserProfile(models.Model):
     user=models.OneToOneField(User,blank=True,null=True,related_name='user',verbose_name=_(u'使用者'))
     company_name=models.CharField(u'企業(或代理商)名稱',max_length=30, default='未知')     #企業商名稱
     product=models.ForeignKey(Product, blank=True,null=True,verbose_name=_(u'產品'))        #產品
     class Meta:
         verbose_name = _(u'配置')
         verbose_name_plural = _(u'使用者配置')
     def __unicode__(self):
         【這裡】_(u'%(user_name)s') % {'user_name':self.user.username}

【這裡】加上return即可。


二、url相關錯誤

靜態檔案無法訪問,如樣式出不來


css樣式總出不來,折騰了一個多小時,原來,urlpatterns 寫成這樣:

urlpatterns = patterns('',
     (r'^ $','login.msg.index'), #首頁
)
#登入註冊
urlpatterns = patterns('',
     (r'^accounts/register/$','login.msg.register_page'), #註冊
     (r'^accounts/login/$','login.msg.login'),      #登入 
     (r'^accounts/logout/$','django.contrib.auth.views.logout',{'next_page':'/'}),  #Django提供一個專用於處理登出表單函式logout
     (r'^accounts/register/success/$','django.views.generic.simple.direct_to_template',{'template':'registration/register_success.html'}),  #註冊成功  
)
 
#admin後臺管理
urlpatterns += patterns('',
     (r'^admin/doc/', include('django.contrib.admindocs.urls')),
     (r'^admin/', include(admin.site.urls)),
)
#靜態檔案的訪問
urlpatterns += patterns('',
     (r'^site_media/(?P.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_SITE}),
     (r'^upload_media/(?P.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}),
)

我把 [登入註冊] url後面也寫成 = 而並非+= ,這就造成了url覆蓋,所以就載入不了靜態檔案,同時首頁也會打不開。


三、編碼錯誤

錯誤型別如下:

DjangoUnicodeDecodeError at /admin/books/book/
'ascii' codec can't decode byte 0xe8 in position 0: ordinal not in range(128). You passed in()

解決方案:


混淆了 python2 裡邊的 str 和 unicode 資料型別。


(0)、你需要的是讓編碼用實際編碼而不是 ascii


(1)、對需要 str->unicode 的程式碼,可以在前邊寫上

import sys
reload(sys)
sys.setdefaultencoding('utf8')

把 str 編碼由 ascii 改為 utf8 (或 gb18030)


(2)、python3 區分了 unicode str 和 byte arrary,並且預設編碼不再是 ascii


參考:http://vososo.com/vo/558


四、其他錯誤

Django POST請求錯誤forbidden(403) CSRF verification failed. Request aborted


在 settings.py 中的MIDDLEWARE_CLASSES 設定下 新增

'django.middleware.csrf.CsrfResponseMiddleware',

重新 runserver.   OK

重點參考:http://blog.csdn.net/feng88724/article/details/7221449


我用的是django1.2.3,當使用session時,也會像上面出錯,這時把下面註釋掉即可:


# 'django.middleware.csrf.CsrfViewMiddleware', #這段程式碼理應註釋掉,在使用session的時候

login:login() takes exactly 1 argument (2 given)


這在登入檢視函式的時候特別常見,原因就是函式login與login模組的名字衝突,如登入url這樣寫:

(r'^account/login/$', 'login'),  #登入

 那麼,對應的檢視函式如下:

def login(request):
    if request.method == "POST":
        try:
            username = request.POST.get('username')
            password = request.POST.get('password')
            user = authenticate(username=username,password=password)
            if user is not None:
                if user.is_active:
                    login(request,user)
                    return HttpResponse('ok')
                else:
                    return HttpResponse('error')
        except Exception,e:
            log.error("login:%s" % str(e))
    return render_to_response('account/login.html')

 當然如果這樣寫,不要忘記匯入:

from django.contrib.auth import authenticate, login

這樣就壞事了,因為出現了兩個login.這就導致了上面的問題,解決辦法有兩個,

修改login檢視函式的名稱和對應的url中。如webLogin

匯入設定:from ..login as _login 這樣也行,別忘了都要改過來。

無法跳轉

如,我想登入。然後登入成功後跳轉到主頁,如上:把上面程式碼改寫成這樣

.....
if user.is_active:
    login(request,user)
    return HttpResponseRedirect('/')
....

但是卻沒有實現跳轉,如下:


這裡並不是跳轉寫錯了,而是沒有注意到我這個登入介面是ajax POST形式的,程式碼如下:

//登入

function _submit(){
    var username = $("input[name='username']").val();
    var password = $("input[name='password']").val();
    if (username == ""){
        art.dialog({content: '使用者名稱不能為空',time :1.5}); 
    }else if(password == ""){
        art.dialog({content: '密碼不能為空',time :1.5});  
    }else{
    $.post('/account/login/',{'username':username,'password':password},function(data){
                if (data =='error'){
                    art.dialog({content: '使用者名稱或密碼錯誤',time :1.5});    
                }
            }); 
    }
}

Query.post( url, [data], [callback], [type] ) :


如果返回,它只返回一個字串。所以並不能在後臺跳轉。

解決方法是: return HttpResponse('ok'),透過接受返回的Ok 來在前臺實現跳轉。


相關文章