在django中覆盖ErrorList类时,奇怪的UTF-8问题

时间:2013-08-16 16:52:09

标签: python django linux ubuntu django-forms

当我尝试通过继承ErrorList并覆盖其as_ul方法来适应Bootstrap错误html类时,我遇到了奇怪的问题。

这是没有覆盖的表单:http://192.241.167.204/normal/

这是覆盖的表单:http://192.241.167.204/override/

请不要介意中文文本。

两个表单将始终验证为错误输入,不会被我搞乱的表单将显示正确的警告消息:

但是我的改变形式并不那么幸运:

Here's my full source in bitbucket, in mercurial

这就是我在forms.py中所做的:

@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()
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的表单类和一个来自我的自定义表单类

的表单类
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

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

观点相当简单:

# -*- 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})

模板实现很简单(form.as_p),所以我会在这里跳过它

我的开发平台(Windows 7 Pro 64位)上不存在此问题,但它出现在我的部署平台(Ubuntu 12.04 LTS 64位,桌面和服务器都有此)。我不确定如果我改用其他Linux平台或Mac会发生什么。

这个问题无关紧要我是把它放在Apache2 + mod_wsgi还是manage.py runserver中,也不是gunicorn。所有都有相同的问题,所以它可能没有部署特定的问题。

我完全不清楚我做错了什么?任何领导都将不胜感激。

1 个答案:

答案 0 :(得分:4)

您使用的是Python 2吗?如果你是,那么而不是写:

format_html('<ul class="errorlist alert alert-error">{0}</ul>',
    format_html_join('', '<li>{0}</li>',((force_text(e),) for e in self)))

写:

format_html(u'<ul class="errorlist alert alert-error">{0}</ul>',
    format_html_join(u'', u'<li>{0}</li>', ((force_text(e),) for e in self)))

u之前添加''让python知道你想要一个unicode字符串而不是一个ASCII字符串。