【问题标题】:Django IntegrityError - can't figure it outDjango IntegrityError - 无法弄清楚
【发布时间】: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


【解决方案1】:

一点返工:

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:
...

【讨论】:

  • 没有这样的返工没有解决方案吗?如果没有,您能否解释一下模型 = Category 在 Meta 类中的作用?如果我想从一次提交中保存两个对象怎么办?
  • ModelForm 是处理模型时的常见做法。它为您省去了重新定义字段的麻烦。事实上,该验证器可能应该在模型本身上定义,在这种情况下,表单只会继承它。 Meta 类是一种配置 ModelForm 的方法——告诉它应该处理什么模型,告诉它应该在表单上显示哪些字段,等等。docs.djangoproject.com/en/dev/topics/forms/modelforms/…
  • 在我接受 ModelForm 之前,有没有办法像我一样做呢? (只是为了让我了解这背后的原因)
  • 你能发布更详细的错误信息吗?这应该是可能的,肯定的。您要么缺少必需的模型字段,要么字段名称(“名称”)中有一些拼写错误,或者诸如此类。方法是有效的,所以它一定是有问题的细节。
  • 啊,clean_name() 必须返回一个值!
猜你喜欢
  • 2013-03-05
  • 2013-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 2014-08-02
  • 1970-01-01
相关资源
最近更新 更多