自定义Django表单不验证

时间:2014-07-23 19:18:43

标签: django django-forms

我使用表单在Django验证问题上工作了几天。经过几天的研究,如何解决它,我发现数据没有得到验证。我的Django表单不会返回任何类型的错误(即使我将错误标记放在模板中)。

我没有使用{{form}},而是决定自定义表单,创建HTML代码并手动放置所有Django表单字段。在此之前,只使用{{ form }}表单正确运行

在这里,我传递了我的代码片段:

template.html:

    <form action="/next_direction/" method="post">
            {% csrf_token %}

    {{ form.errors }}
    {{ form.non_field_errors }}

            Elementa: {{ form.elementa }}<br/>
            Elementb: {{ form.elementb }}<br/>
            Elementc: {{ form.elementc }}<br/>

            {% for hidden in form.hidden_fields %}
                    {{ hidden }}
            {% endfor %}
            <input type="submit" value="Enviar">

    </form>

现在,在forms.py中:

from django import forms
from django.utils.translation import ugettext_lazy as _
from alta_tecnologias.models import Tecnologia
import datetime
from django.forms.extras.widgets import SelectDateWidget
from django.core.exceptions import ValidationError

class AltaTecnologias(forms.ModelForm):
    def __init__(self, *args, **kwargs):
            super(AltaTecnologias, self).__init__(*args, **kwargs)
            self.fields['fecha'].initial = datetime.date.today()


    elementa = forms.CharField(widget=forms.TextInput())
    elementb = forms.CharField(widget=forms.TextInput())
    elementc = forms.CharField(widget=forms.TextInput())
    fecha = forms.DateField(widget=forms.HiddenInput())

    def clean(self):
            cleaned_data = super(AltaTecnologias, self)
            return self.cleaned_data

    class Meta:
            model = Tecnologia

在views.py中:

from django import shortcuts
from django.shortcuts import render
from django.contrib.auth.decorators import login_required
from django.template import Context, loader, RequestContext
from alta_tecnologias.forms import AltaTecnologias
from alta_tecnologias.models import Tecnologia
from django.http import HttpResponse, HttpResponseRedirect

@login_required
def alta_tecnologias(request):
        if request.POST:
                form = AltaTecnologias(request.POST)
                if form.is_valid():
                        form.save()
                        return HttpResponse("OK")

        context = Context({'is_auth': str(request.user.is_authenticated()), 'form': AltaTecnologias()})
        template = loader.get_template("alta_tecnologias.html")
        return render(request, 'alta_tecnologias.html', context)

我根据网络上发现的其他答案对我的代码做了很多更改,但似乎任何人都在处理我的代码。

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

def clean(self):
        cleaned_data = super(AltaTecnologias, self)
        return self.cleaned_data

应该是:

def clean(self):
        cleaned_data = super(AltaTecnologias, self).clean()
        return cleaned_data

无论如何,当你没有对你的数据进行任何检查时,我没有看到覆盖干净方法的任何意义。

答案 1 :(得分:1)

在将表单传递给模板之前,您始终会重新实例化表单,因此发布的版本中的错误将会丢失。相反,只为GET和POST中的每一个实例化一次。

    if request.POST:
            form = AltaTecnologias(request.POST)
            if form.is_valid():
                    form.save()
                    return HttpResponse("OK")
    else:
        form = AltaTecnologias()

    context = {'form': form}
    return render(request, 'alta_tecnologias.html', context)

并非您不需要创建Context对象,并且您对get_template的调用完全没有必要,因为这两件事都是由render函数完成的。另请注意,您可以直接在模板中访问{{ user.is_authenticated }},因此明确地传递它是没有意义的。另外,正如Lukas所说,你对clean的覆盖没有任何作用,所以你也可以删除它。