1

ErrorList を継承し、そのas_ulメソッドをオーバーライドして、Bootstrap エラー HTML クラスに適合させようとすると、奇妙な問題に直面しました。

これはオーバーライドなしのフォームです。http://192.241.167.204/normal/

これはオーバーライドのあるフォームです。http://192.241.167.204/override/

中国語の文章は気にしないでください。

両方のフォームは常に間違った入力として検証されます。私が台無しにしないフォームには正しい警告メッセージが表示されます。

しかし、私の変更されたフォームではそれほど幸運ではありません:

mercurial の bitbucket にある私の完全なソースを次に示します。

これは私が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)

比較のために、通常のフォームで 1 つのフォーム クラスを作成し、カスタマイズしたフォーム クラスから 1 つを作成しました。

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 でも問題ありません。すべて同じ問題を抱えているため、おそらくデプロイ固有の問題ではありません。

私は何を間違えたのか完全に無知です? 任意のリードをいただければ幸いです。

4

1 に答える 1

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 は ASCII 文字列ではなく Unicode 文字列が必要であることを認識できます。

于 2013-08-16T17:44:32.220 に答える