2012-07-24 144 views
0

这是我的模型:Django:我的代码有什么问题?

class war(models.Model): 
    title = models.CharField(max_length=20) 

class option(models.Model): 
    warval =models.ForeignKey(war) 
    value = models.CharField(max_length=10) 

class warform(ModelForm): 
    class Meta: 
     model = war 

class option_form(ModelForm): 
    class Meta: 
     model = option 
    exclude = ('warval') 

这是处理选项创建的视图:

def warhandler(request,war_id): 
    f=modelformset_factory(option,form=option_form) 
    wobj=get_object_or_404(war,pk=war_id) 
    if request.method == 'POST': 
     formset = f(request.POST,queryset=option.objects.filter(warval=wobj)) 
     if formset.is_valid(): 
      formset.save() 
      return HttpResponse("Saved!check your model") 
     else: 
      return render_to_response("formset.html",RequestContext(request,{"set":formset})) 
    else: 
     formset = f(queryset=option.objects.filter(warval=wobj)) 
     print(formset) 
     return render_to_response("formset.html",RequestContext(request,{"set":formset,"war":wobj})) 

所以,当我提交表单这一观点,我得到以下错误:

Exception Type: IntegrityError 
Exception Value: hit_option.warval_id may not be NULL 

我知道这个错误是什么,它为什么会来,但我怎么能删除这个错误?

回答

1

制作warval与

class option(models.Model): 
    warval =models.ForeignKey(war, null=True) 
    value = models.CharField(max_length=10) 

或保存之前定义formset.warval,使默认值的非必填字段...

编辑:

阅读herehere在窗体上使用字段的子集并保存。

+0

你能告诉我如何以及在哪里定义“formset.warval”? – 2012-07-24 10:42:30

2

如您所知,这是因为您没有在任何地方设置外键值。您可能想要使用inlineformset_factory,这将负责将FK设置为​​父对象war

+0

内联formset是一个不错的选择。我刚才试了一下,代码运行良好。但是如果我在“option”模型中也有“User”外键呢? – 2012-07-24 10:43:56