第一次调用表单时禁用验证

时间:2015-07-22 09:58:46

标签: django forms validation

我在使用Django表格时遇到了一些麻烦。当我调用我的表单站点时,总是出现验证错误(此字段是必需的)。如果字段没有像javascript函数那样填充,我更喜欢在单击提交按钮后看到此消息。另外我正在使用正则表达式进行验证,这工作正常。

我正在使用CVB。这是一些代码:

models.py

 class Institute(models.Model):
    name = models.CharField(max_length=50)
    timestamp = models.DateTimeField(auto_now_add=True)  

views.py

class InstituteCreate(CreateView):
    model = Institute
    form_class = InstituteForm
    success_url = reverse_lazy('institute_list')

forms.py

class InstituteForm(forms.ModelForm):

    name= forms.CharField(error_messages={'required': 'Own Error Text'}, validators=[RegexValidator(regex='^[a-zA-ZäüößÄÜÖ]*$', message='forbidden string', code='string_invalid')])

    class Meta:
        model = Institute
        fields = ['name']

希望有人知道如何解决它。

EDIT1:

我的模板非常简单

{% block pagetitle %}Institutes{%endblock %}
{% block content %}
    <form class="form-horizontal" name="form_group" method="post">
        {% csrf_token %}
            <div>
                {{ form.as_p }}
            </div>
            <input class="btn btn-primary" type="submit" value="click me" />
    </form>
{% endblock %}

和我的网址配置:

urlpatterns = patterns('',  
    url(r'^institute_create/$', views.InstituteCreate.as_view(), name='institute_create'),
)

我是Django开发的新手,所以我会尝试更详细地解释这个问题:

在我的网站上,当我打开链接www.exampleurl.com/institute_create时,会显示我的表格。然后我看到我必须输入研究所名称的字段。在该字段上方显示文本“此字段是必需的”。但我不想看到这个,直到我尝试提交一个空表格。

当我输入一些不匹配的文本并按下提交按钮时,错误文本字段会按预期将其消息更改为禁用字符串。

3 个答案:

答案 0 :(得分:2)

除非您对视图使用POST请求,否则表单验证不会被触发。您的代码中的其他位置可能存在错误,但是,您希望解决的代码有几个问题:

Python中的类应始终以大写字母开头,并遵循CapWords convention

class Institute(models.Model):
    name = models.CharField(max_length=50)

    # just use the built-in `auto_now_add` argument
    timestamp = models.DateTimeField(auto_now_add=True)

class InstituteCreate(CreateView):
    model = Institute
    form_class = InstituteForm
    success_url = reverse_lazy('institute_list')

class InstituteForm(forms.ModelForm):

    # All Django model/form fields are required by default, so you
    # can drop the `required=True` here
    name= forms.CharField(validators=[RegexValidator(regex='^[a-zA-ZäüößÄÜÖ]*$',
        message='forbidden string', code='string_invalid')])

class Meta:
    model = Institute
    fields = ['name']

否则,无法区分班级定义和班级实例之间的区别,并且你不太可能遇到碰撞。

出于好奇,您是否看到浏览器中的HTML5验证错误与Django的错误?如果您可以将模板代码添加到您的问题中,则可能有所帮助。

答案 1 :(得分:0)

我知道这是一个非常古老的问题,但我没有看到答案。我也是django的初学者,当我遇到同样的问题时,我正在关注Django教程。 我这样解决了:

if 'voteButton' in request.POST:
    context = {
        'question': question,
        'error_message': "You didn't select a choice"
    }
    return render(request, 'polls/details.html', context)
elif:
    # do something else. Display error message

voteButton是表单中“提交”按钮的名称。希望这可以帮助!如果这种方法有误,请告诉我。

答案 2 :(得分:0)

正如布兰登所说,您的表单将在POST请求中得到验证。因此,请确保在页面的首次访问期间,表单不会绑定到POST请求。

例如,不要这样做:

def register(request):
    form = RegistrationForm(request.POST)
    if request.method == 'POST':
        if form.is_valid():
            # Do something
    return render(request, 'register.html', {'form': form}) 

仅当通过POST请求访问页面时,才应将表单绑定到POST请求。这应该有帮助:

def register(request):
    if request.method == 'POST':
        form = RegistrationForm(request.POST)
        if form.is_valid():
            # DO something
    else :
        form = RegistrationForm()
    return render(request, 'register.html', {'form': form})