Django常見出錯解決方案匯總-乾頤堂


一、模板類型錯誤:

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

class UserProfile(models.Model):

     """

     功能說明:        擴展用戶

     ---------------------------------------------------------------------------

     修改人            修改時間                修改原因

     ------------------------------------------------------------------------------

     BeginMan            2013-05-05

     """

     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<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_SITE}),

     (r'^upload_media/(?P<path>.*)$', '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 <Book: [Bad Unicode data]> (<class 'books.models.Book'>)

 

解決方案:

 

混淆了 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):

    """

    功能說明:        登 錄

    ------------------------------------------------------------

    開發者           修改時間           修改原因

    ------------------------------------------------------------

    beginman        2013-06-05

    """

    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 來在前台實現跳轉。

http://www.qytang.com/cn/list/28/422.htm
http://www.qytang.com/cn/list/28/421.htm
http://www.qytang.com/cn/list/28/420.htm
http://www.qytang.com/cn/list/28/417.htm
http://www.qytang.com/cn/list/28/416.htm
http://www.qytang.com/cn/list/28/407.htm
http://www.qytang.com/cn/list/28/403.htm
http://www.qytang.com/cn/list/28/404.htm
http://www.qytang.com/cn/list/28/397.htm
http://www.qytang.com/cn/list/28/396.htm
http://www.qytang.com/cn/list/28/395.htm
http://www.qytang.com/cn/list/28/394.htm


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM