【发布时间】:2014-02-17 02:02:00
【问题描述】:
当有一个有效的提交时,我的 porgram 给出了一个 IntegrityError,也就是说,当(我认为)程序进入 form.is_valid() 分支时。 有人知道是什么原因造成的吗?
P.S: 我把代码从 no form using 改成了 form using,然后就开始报错了
我有以下看法
def new_category(request):
if request.method == "POST":
form = NewCategoryForm(request.POST)
if form.is_valid():
cd = form.cleaned_data
p = Category(name=cd["name"])
p.save()
return HttpResponseRedirect(reverse("objects:index"))
else:
return render(request,"objects/new_category.html",{"form":form})
else:
form = NewCategoryForm()
return render(request,"objects/new_category.html",{"form":form})
和模型
class Category(models.Model):
name = models.CharField("nome da categoria",max_length=100)
def __unicode__(self):
return self.name
def sorted_events(self):
return self.event_set.order_by("start")
class Event(models.Model):
category = models.ForeignKey(Category)
start = models.DateTimeField("horario", default=0)
和形式
class NewCategoryForm(forms.Form):
name = forms.CharField(max_length=10,
error_messages=my_errors)
def clean_name(self):
if len(self.cleaned_data["name"]) < 3:
raise forms.ValidationError("Nome demasiado curto!")
和模板
<!DOCTYPE html>
<html lang="en">
{% load staticfiles %}
<link rel="stylesheet" type="text/css" href="{% static 'objects/style.css' %}" />
<form action="{% url 'objects:new_category' %}" method="post">
{% csrf_token %}
<div class="field">
{% for error in form.name.errors %}
<p> {{ error }} </p>
{% endfor %}
{{ form.name }}
</div>
<button type="submit">Submit!</button>
</form>
</body>
</html>
编辑 1: 我刚刚进行了一些测试,发现了一个有点奇怪的行为。我汇总了一个有效的输入,然后执行
print request.POST
print form.is_valid()
print cd #this one inside the if form.is_valid()
输出是这样的
<QueryDict: {u'csrfmiddlewaretoken': [u'ujlYhAFkFd7PuGJMk2aEmvWkDZmg4HlX'], u'name': [u'awdawdd']}>
True
{'name': None}
如果request.POST中有“awdawdd”字符串,为什么“name”的值为“None”?
编辑 2: 更多信息。 奇怪的是,当我尝试在“if form.is_valid()”之前的行中调用 form.cleaned_data 时,它说:
AttributeError: 'NewCategoryForm' object has no attribute 'cleaned_data'
【问题讨论】:
-
两件事:
Category是如何定义的,堆栈跟踪是什么? -
我已经编辑了,现在你也可以看到模型了
-
只需将
p = Category(name=cd["name"])更改为p = Category.objects.create(name=cd["name"])并删除p.save() -
为什么我不再需要保存对象了?无论如何都会保存在数据库中吗?
-
是的.. create 为您将其保存在数据库中
标签: python django django-forms django-views