2014-02-17 37 views
0

當有一個有效的提交時,也就是說,當我(認爲)程序進入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' 
+0

2件事情:如何定義Category,以及什麼是堆棧跟蹤? – karthikr

+0

我編輯過了,現在你也可以看到模型了 – user3264316

+0

只需將'p = Category(name = cd [「name」])''改爲'p = Category.objects.create(name = cd [「name」]) '並刪除'p.save()' – karthikr

回答

0

返工位:

class NewCategoryForm(forms.ModelForm): 

    class Meta: 
     model = Category 
     fields = ['name',] 

    def validate_name(name): 
     if len(name) < 3: 
      raise forms.ValidationError("Nome demasiado curto!") 

而在查看:

... 
if form.is_valid(): 
    form.save() # will save to DB 
    return ... 
else: 
... 

或者:

... 
if form.is_valid(): 
    cat = form.save(commit=False) # won't save to DB 
    cat = do_stuff_with_cat 
    cat.save() 
    # to save another instance, one possibility is: 
    cat.pk = None 
    cat.save() 
    return ... 
else: 
... 
+0

沒有這樣的返工沒有解決方案嗎? 如果不是,你能否向我解釋一下Meta類中model = Category的作用?如果我想從單個提交中保存兩個對象,該怎麼辦? – user3264316

+1

ModelForm是使用模型時的常見做法。它爲您節省了重新定義字段的麻煩。事實上,驗證者可能應該在模型本身上定義,在這種情況下,表單將會繼承它。 Meta類是配置ModelForm的一種方式 - 告訴它應該處理什麼模型,告訴它應該在窗體上顯示哪些字段,等等。https://docs.djangoproject.com/zh/dev/topics/forms/ modelforms /#modelform – frnhr

+0

在我接受ModelForm之前,有沒有像我這樣做的方法?(只是爲了讓我明白這是什麼) – user3264316

相關問題