當有一個有效的提交時,也就是說,當我(認爲)程序進入form.is_valid()分支時,我的porgram正在給出IntegrityError。 有沒有人知道是什麼原因造成的?Django IntegrityError - 找不出來
PS:我使用,以形成不使用形式改變了代碼,那就是當錯誤開始
我有以下幾點看法
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」串在那兒?
編輯2: 更多信息。 奇怪的是,當我嘗試打電話form.cleaned_data右側前行,「如果form.is_valid()」,它說:
AttributeError: 'NewCategoryForm' object has no attribute 'cleaned_data'
2件事情:如何定義Category,以及什麼是堆棧跟蹤? – karthikr
我編輯過了,現在你也可以看到模型了 – user3264316
只需將'p = Category(name = cd [「name」])''改爲'p = Category.objects.create(name = cd [「name」]) '並刪除'p.save()' – karthikr