gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:39:16 25 4
gpt4 key购买 nike

当我试图通过继承 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)

为了比较,我制作了一个带有普通表单的表单类和一个来自自定义表单类的表单类

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

View 相当简单:

# -*- 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 64bit)上不存在,但是在我的部署平台上(Ubuntu 12.04 LTS 64bit,Desktop 和 Server 都有这个问题)出现了。我不确定如果我换到其他 linux 平台或 Mac 会发生什么。

这个问题不管我放在Apache2+mod_wsgi还是放在manage.py runserver,gunicorn也不行。所有人都有同样的问题,所以它可能不是特定于部署的问题。

我完全不知道我做错了什么?任何线索将不胜感激。

最佳答案

您使用的是 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 字符串。

关于python - 在 django 中覆盖 ErrorList 类时出现奇怪的 UTF-8 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18278426/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com