作者doomleika (iSuck)
看板Python
标题Re: [问题] Python 2.7与UTF-8
时间Sat Aug 17 00:12:05 2013
※ 引述《doomleika (iSuck)》之铭言:
: 前阵子写django东西的时候遇到了一点问题:
: 'ascii' codec can't encode characters in position 0-11: ordinal not in range(128)
: ...
: Unicode error hint
: The string that could not be encoded/decoded was: 登入失败,请修正帐号密码
: Error during template rendering
图多,建议使用shift+Q以网页模式浏览较好
实际把东西放回去後发现并没有解决问题,我弄了一个简化版的source出来:
https://bitbucket.org/doomleika/django_form_override/src
forms.py
http://0rz.tw/WZmEs
我使用了继承ErrorList的方式让错误讯息的<ul>可以塞入bootstrap的错误class
@python_2_unicode_compatible
class BootstrapErrorList(ErrorList):
def as_ul(self):
if not self: return ''
return format_html('<ul class="errorlist alert alert-error">{0}</ul>',
format_html_join('', '<li>{0}</li>',
((force_text(e),) for e in self)
)
)
def __str__(self):
return self.as_ul()
然後用一个Form Class使用这个ErrorList
class BootstrapForm(forms.Form):
def __init__(self, *args, **kwargs):
new_kwargs = {'error_class': BootstrapErrorList}
new_kwargs.update(kwargs)
super(BootstrapForm, self).__init__(*args, **new_kwargs)
然後让官方推荐的方式做form的clean
class FormWithOverride(BootstrapForm):
iamalwayswrong = forms.CharField(max_length=200)
def clean(self):
cleaned_data = super(FormWithOverride, self).clean()
raise forms.ValidationError(u'错')
return cleaned_data
作为对照,这边使用了一个不使用BootstrapForm的标准Form,写法完全一样
class FormWithoutOverride(forms.Form):
iamalwayswrong = forms.CharField(max_length=200)
def clean(self):
cleaned_data = super(FormWithoutOverride, self).clean()
raise forms.ValidationError(u'错')
return cleaned_data
views.py基本上就只是两个不同版本form的对照
# -*- coding: UTF-8 -*-
# Create your views here.
from django.shortcuts import render
from test_app.forms import *
def without_override(request):
if request.method == 'GET':
form = FormWithoutOverride()
if request.method == 'POST':
form = FormWithoutOverride(request.POST)
if form.is_valid(): # will never be valid
pass
return render(request, 'normal_form.html', {'form': form})
def with_override(request):
if request.method == 'GET':
form = FormWithOverride()
if request.method == 'POST':
form = FormWithOverride(request.POST)
if form.is_valid(): # will never be valid
pass
return render(request, 'override_form.html', {'form': form})
template的实作完全trivial(form.as_p)就不列出来占版面了
线上展示的网页在此:
没有override的版本
http://192.241.167.204/normal/
画面
http://imgur.com/yDDLxMw
有override的版本
http://192.241.167.204/override/
画面
http://imgur.com/3oVRH4D
没有override输入错误的画面,正常
http://imgur.com/JKSetfu
override submit後整个就挂掉了...
http://imgur.com/T1Vf92Q
请问我的问题是在哪呢?谢谢m(_ _)m
1F:→ kilfu0701:format_html 里面的字串加上u (?) 08/17 01:53
超神奇...老外在stackoverflow回答一样的答案...就过了o_O
http://0rz.tw/1tzAS
不能理解这是怎麽回事?
原本继承的class ErrorList用的string里面并没有使用u'i_am_unicode_string'而是
'regular_string' 但他还是能过,这是什麽原因o_O
※ 编辑: doomleika 来自: 42.76.232.31 (08/17 02:13)