我使用表单在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)
我根据网络上发现的其他答案对我的代码做了很多更改,但似乎任何人都在处理我的代码。
感谢您的帮助!
答案 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
的覆盖没有任何作用,所以你也可以删除它。