0

ここでdjangoフォームに取り組んでいますが、エラーに悩まされています。私はそれらを検出する方法を知っていますが、(何らかの理由で) フォームの下にエラーを出力することができません。

クラス :

class descclient_form(forms.Form):

TYPE_CHOICE = (
('C', ('Client')),
('F', ('Facture')),
('V', ('Visite'))
)

file_type = forms.ChoiceField(choices = TYPE_CHOICE, widget=forms.RadioSelect)
file_name = forms.CharField(max_length=200)
file_cols = forms.CharField(max_length=200, widget=forms.Textarea)
# file_date = forms.DateField()
file_sep = forms.CharField(max_length=5, initial=';')
file_header = forms.CharField(max_length=200, initial='0')

# Check if file_cols is correctly filled
def clean_cols(self):
    cleaned_file_type = self.cleaned_data.get("file_type")
    cleaned_file_cols = self.cleaned_data.get("file_cols")

    if cleaned_file_type == 'C':
        if 'client' not in cleaned_file_cols:
            self._errors['file_cols'] = [u'Requiers \'Client\' in collumn selection']
            print 'error'
    if cleaned_file_type == 'F':
        mandatory_field = ('fact', 'caht', 'fact_dat')
        for mf in mandatory_field:
            if mf not in cleaned_file_cols:
                self._errors["file_cols"] = self.error_class(['Requiers \'fact\', \'caht\' \'fact_dat\ in file_cols'])
                print 'error'
    return self.cleaned_data

と呼ばれる関数は次のとおりです。

def descclient(request):

if request.method == 'POST':
    form = descclient_form(data=request.POST)
    if form.is_valid():
        form.clean_cols()
return render_to_response('descclient.html', {'form': descclient_form}, context_instance=RequestContext(request))

そしてテンプレート:

<form action="/descclient" method="post">
<div class="fieldWrapper">
    {{ form.file_type_errors }}
    <label for="id_subject">File type:</label>
    {{ form.file_type }}
</div>

<div class="fieldWrapper">
    {{ form.file_name_errors }}
    <label for="id_subject">File name:</label>
    {{ form.file_name }}
</div>

<div class="fieldWrapper">
    {{ form.file_cols_errors }}
    <label for="id_subject">Collumns:</label>
    {{ form.file_cols }}
</div>

<div class="fieldWrapper">
    {{ form.file_sep_errors }}
    <label for="id_subject">Separator:</label>
    {{ form.file_sep }}
</div>

<div class="fieldWrapper">
    {{ form.file_header_errors }}
    <label for="id_subject">Header:</label>
    {{ form.file_header }}
</div>
{% csrf_token %}
<p><input type="submit" value="Validate"></p>

いくつかの理由で、「{{ form.file_cols_errors }}」は何も出力しません

編集 :

したがって、指摘したように、clean_cols メソッドを clean に変更しました。if ステートメントにも入らないので、ある種の迷子になっているに違いありません

def clean(self):
    cleaned_data = super(descclient_form, self).clean()
    cleaned_file_type = cleaned_data("file_type")
            cleaned_file_cols = cleaned_data("file_cols")

    if cleaned_file_type == 'C':
        if 'client' not in cleaned_file_cols:
            raise forms.ValidationError("This field throws an error")
    if cleaned_file_type == 'F':
        mandatory_field = ('fact', 'caht', 'fact_dat')
        for mf in mandatory_field:
            if mf not in cleaned_file_cols:
                raise forms.ValidationError("This field throws an error")
    return cleaned_data
4

2 に答える 2

2

その代わりに、メソッドを実装してそこでこれらの検証を行う必要があるclean_cols後に呼び出します。is_valid()clean

詳細については、 https://docs.djangoproject.com/en/1.4/ref/forms/validation/#cleaning-and-validating-fields-that-depend-on-each-otherを参照してください。

于 2012-07-20T08:09:05.667 に答える
0

「clean_file_cols」メソッドで ValidationError を発生させる必要があります。

raise forms.ValidationError("This field throws an error")

詳細については、ドキュメントを参照してください。ところで、ほとんどの Web サーバー構成ではサーバー エラーが発生するため、django プロジェクトのどこでも「print」を使用しないでください。代わりにロギングを使用してください。

于 2012-07-20T08:08:35.410 に答える