一、模板類型錯誤:
錯誤原因:在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