0

フォーム.py

class PhoneForm(forms.ModelForm):

    fields = ['user','name1','number1','name2','number2','name3','number3','emergency','emergency_number']
def clean(self):
        cd=self.cleaned_data
        number1=cd.get('number1')
        number2=cd.get('number2')
        number3=cd.get('number3')

        if (number1.isalpha()):
            raise forms.ValidationError("Please enter a valid phone number")
        return number1

        if(number2.isalpha()): 
            raise forms.ValidationError("Please enter a valid phone number")
        return number2   

        if(number3.isalpha()): 
            raise forms.ValidationError("Please enter a valid phone number")
        return number3  

template.html

            <tr>
                <td>{{PhoneForm.name1}}</td>
                <td>{{PhoneForm.number1}}{{ PhoneForm.number1.errors }}</td>
            </tr>

ビュー.py

def add_phone(request):

    phoneForm = PhoneForm({'user':request.user}) 
    phone = Phone_info.objects.get(user=request.user)
    phoneForm = PhoneForm(instance=phone) 
    if request.method=='POST':   
        phoneForm = PhoneForm(request.POST,instance=phone)
        if phoneForm.is_valid():
            phone=phoneForm.save(commit=False)
            phone.save()
            return redirect('/member/contact-list/')

    return render_to_response('incident/add_phone.html',
    {
    'about_menu': True,
    'PhoneForm' :phoneForm
    },
    context_instance=RequestContext(request))

以下のトレースバックを取得する

Traceback:
File "/usr/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  111.                         response = callback(request, *callback_args, **callback_kwargs)
File "/root/Projects/ir/incident/views.py" in add_phone
  634.         if phoneForm.is_valid():
File "/usr/lib/python2.7/site-packages/django/forms/forms.py" in is_valid
  121.         return self.is_bound and not bool(self.errors)
File "/usr/lib/python2.7/site-packages/django/forms/forms.py" in _get_errors
  112.             self.full_clean()
File "/usr/lib/python2.7/site-packages/django/forms/forms.py" in full_clean
  269.         self._post_clean()
File "/usr/lib/python2.7/site-packages/django/forms/models.py" in _post_clean
  308.         self.instance = construct_instance(self, self.instance, opts.fields, opts.exclude)
File "/usr/lib/python2.7/site-packages/django/forms/models.py" in construct_instance
  39.                 or not f.name in cleaned_data:

Exception Type: TypeError at /member/add-phone/
Exception Value: argument of type 'NoneType' is not iterable

電話番号フィールドの検証用。

条件は、数字のみを使用する必要があり、アルファベットまたは英数字を使用しないでください。上記のコードはエラーを生成せず、検証は行われていません。コードで何が問題になったのですか。

ありがとう

4

3 に答える 3

2

ここにはたくさんの問題があります。

まず、電話番号を整数として保存しないでください。整数フィールドでは、括弧、ダッシュ、先頭のゼロ、および電話番号が行うその他のあらゆる種類のことは許可されません。

第二に、cleanメソッドは最後に戻る必要self.cleaned_dataがあります。これが実際の問題の原因です。

clean_FIELDNAME第三に、メソッドで個々のフィールドの検証を行う必要がありますclean_number1

第 4 に、正当な理由で実際に整数フィールドを使用していた場合、整数が含まれていることを検証する必要はありません。Django はすでに自動的にそれを行っているからです。何らかの理由でモデル フィールドが整数フィールドではなく、整数として検証したい場合は、フォームのフィールド定義をオーバーライドしてください: number1 = forms.IntegerField().

于 2013-05-07T09:05:54.150 に答える
2

これはうまくいくはずです。そして、ソースvalidate_integer()を読んで、彼らがそこで何をしたかを確認することを積極的にお願いします.

from django.core.validators import validate_integer

class PhoneForm(forms.ModelForm):
    fields = ['user','name1','number1','name2','number2','name3','number3','emergency','emergency_number']

    def clean(self):
        cd=self.cleaned_data
        validate_integer(cd.get('number1', None))
        validate_integer(cd.get('number2', None))
        validate_integer(cd.get('number3', None))
于 2013-05-07T08:36:05.663 に答える