一、模板型別錯誤:
錯誤原因:在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 來在前臺實現跳轉。