一、模板类型错误:
错误原因:在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 来在前台实现跳转。