Python Django IntegrityError-can';我想不出来
当有有效提交时,我的程序会给出一个IntegrityError,也就是说,当(我认为)程序进入表单.is_valid()分支时。 有人知道是什么引起的吗 注:我将代码从no form using更改为form using,这就是错误开始的时候 我有以下看法Python Django IntegrityError-can';我想不出来,python,django,django-forms,django-views,Python,Django,Django Forms,Django Views,当有有效提交时,我的程序会给出一个IntegrityError,也就是说,当(我认为)程序进入表单.is_valid()分支时。 有人知道是什么引起的吗 注:我将代码从no form using更改为form using,这就是错误开始的时候 我有以下看法 def new_category(request): if request.method == "POST": form = NewCategoryForm(request.POST) if form.is_valid():
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!")
输出是这样的
<QueryDict: {u'csrfmiddlewaretoken': [u'ujlYhAFkFd7PuGJMk2aEmvWkDZmg4HlX'], u'name': [u'awdawdd']}>
True
{'name': None}
一点返工:
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():
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:
...
2件事:
Category
是如何定义的,stacktrace是什么?我已经编辑过了,现在你可以看到模型只需将p=Category(name=cd[“name”])
更改为p=Category.objects。创建(name=cd[“name”])
并删除p.save()
为什么我不再需要保存对象了?它是否会保存在数据库中?是的。。create将其保存在db中供您使用没有这种返工的解决方案吗?如果没有,你能解释一下model=Category在元类中的角色吗?如果我想从一次提交中保存两个对象,该怎么办?使用模型时,ModelForm是常见的做法。它省去了重新定义字段的麻烦。事实上,该验证器可能应该在模型本身上定义,在这种情况下,表单将直接继承它。Meta类是配置ModelForm的一种方法——告诉它应该处理什么模型,告诉它应该在表单上显示什么字段,等等。在我接受ModelForm之前,有没有一种方法可以像我现在这样做?(为了让我明白这背后的原因)你能发布更详细的错误消息吗?这肯定是可能的。您可能缺少一个必需的模型字段,或者字段名称(“名称”)中有一些键入错误,或者类似的错误。该方法是有效的,因此它一定是一个有问题的细节。啊,clean_name()必须返回一个值!
AttributeError: 'NewCategoryForm' object has no attribute 'cleaned_data'
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:
...