【问题标题】:django form validation of fields depond on each other, and validate one of them independently字段的django表单验证相互依赖,并独立验证其中一个
【发布时间】:2013-09-16 09:24:40
【问题描述】:

我正在学习表单验证,如果我想在clean方法中同时验证name和money,似乎有很多错误,例如AttributeError,KeyError。

例如:

AttributeError at /learn/form_validate/
'NoneType' object has no attribute 'strip'

我的文件:

forms.py:

from django import forms
from django.core.exceptions import ValidationError

money_db = {
        'Tom': 100,
        'Jack': 200,
        'Lucy': 300,
        }
class ValidationForm(forms.Form):
    name = forms.CharField(required=True)
    money = forms.FloatField(required=True)

    def clean_name(self):
        name = self.cleaned_data.get('name').strip()
        if not name in ['Tom', 'Jack', 'Lucy']:
            raise ValidationError('No such person!')
        return name

    def clean(self):
        cleaned_data = self.cleaned_data
        name = cleaned_data.get('name').strip() # AttributeError here
        money = cleaned_data.get('money')
        if money > money_db[name]:
            raise ValidationError("You don't have so much money!")
        return cleaned_data

views.py:

from django.shortcuts import render_to_response
from django.template import RequestContext
from forms import ValidationForm

def form_validate(request, template='learn/form_validate.html'):
    form = ValidationForm()

    if request.GET:
        form = ValidationForm(request.GET)
        if form.is_valid():
            pass

    context = RequestContext(request,{
        'form': form,
    })
    return render_to_response(template, context)

html:

{% load staticfiles %}
<html>
    <body>
        <form action="">
            <div>{{form.errors}}</div>
            <div>Name: {{form.name}}</div>
            <div>Money: {{form.money}}</div>
            <input type="submit" value="Submit" />
        </form>
    </body>
</html>

【问题讨论】:

  • 看起来你不会在request.GET 中获得任何数据,请改用request.POST

标签: django django-forms


【解决方案1】:

您的 clean_name 函数仅返回 name 因此关键错误。您必须返回整个清理后的数据。看看这里https://docs.djangoproject.com/en/dev/ref/forms/validation/#cleaning-a-specific-field-attribute

【讨论】:

    【解决方案2】:
    def clean(self):
        cleaned_data = self.cleaned_data
        name = cleaned_data.get('name') # if name is invalid, it is None
        money = cleaned_data.get('money') # if money is invalid, it is None
        if name and money: # make sure they are valid
            if money > money_db[name]:
                raise ValidationError("You don't have so much money!")
        return cleaned_data
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-10
      • 2020-04-17
      • 1970-01-01
      • 1970-01-01
      • 2011-10-26
      • 2012-12-29
      • 2015-09-20
      相关资源
      最近更新 更多