Django外键未设置,因此无法保存表单

Django外键未设置,因此无法保存表单,django,foreign-keys,django-views,django-forms,django-1.3,Django,Foreign Keys,Django Views,Django Forms,Django 1.3,我在两个表之间有一个简单的外键关系。我可以保存父级,但无法保存具有父级外键的子级。这就是我的模型的样子: class Product(models.Model): month_choices = tuple((m,m) for m in calendar.month_abbr[1:]) year_choices = tuple((str(n), str(n)) for n in range(2004, datetime.now().year +2 )) id

我在两个表之间有一个简单的外键关系。我可以保存父级,但无法保存具有父级外键的子级。这就是我的模型的样子:

class Product(models.Model):
    month_choices   = tuple((m,m) for m in calendar.month_abbr[1:])
    year_choices    = tuple((str(n), str(n)) for n in range(2004, datetime.now().year +2 ))
    id              = models.AutoField(primary_key = True)
    title           = models.CharField(max_length = 1024)
    product_type    = models.ForeignKey(ProductType)
    month           = models.CharField(max_length =3, choices=month_choices)
    year            = models.CharField(choices=year_choices, max_length = 4)
    project         = models.CharField(max_length = 15, null = True, blank = True)
    url             = models.URLField(null = True, blank = True)
    export_to_xsede = models.BooleanField()
    #def __str__(self):
    #    return str(self.id)
    class Meta:
        db_table = "product"

class ProductResource(models.Model):
    CHOICES             = (('A','A'),('B','B'),('C','C'),('D','D'),('E','E'))
    id                  = models.AutoField(primary_key = True)
    product             = models.ForeignKey(Product)
    resource            = models.CharField(choices=CHOICES, max_length = 15)
我的看法是:

class PublicationForm(forms.ModelForm):
        title = forms.CharField(widget=forms.TextInput(attrs={'size':'70'}),required=False)
        url = forms.CharField(widget=forms.TextInput(attrs={'size':'70'}),required=False)
        class Meta:
            model = Product
class ResourceForm(forms.ModelForm):
        resource = forms.MultipleChoiceField(choices=ProductResource.CHOICES, widget = forms.CheckboxSelectMultiple)
        class Meta:
            model = ProductResource
我保存父对象:

saved_publication = publications_form.save()
但我无法保存资源表单:

resource_form = ResourceForm(request.POST, instance = saved_publication)
resource_form.product = saved_publication
resource_form.save()
当我打印resource_form.errors时,我得到:

<ul class="errorlist"><li>product<ul class="errorlist"><li>This field is required.</li></ul></li></ul>
  • 产品
    • 此字段为必填项。

我不知道为什么在这种情况下外键没有设置

我假设您不想在表单上显示product字段,因此您应该将其从表单中排除,以便验证通过:

class ResourceForm(forms.ModelForm):
    resource = forms.MultipleChoiceField(choices=ProductResource.CHOICES, widget = forms.CheckboxSelectMultiple)
    class Meta:
        model = ProductResource
        exclude = ['product']
然后在视图中,只需在调用
is\u valid()
后手动设置产品。只需确保在
表单上传递
commit=False
。save()
,以便在设置产品之前,它不会实际保存到数据库中。比如说

...
saved_publication = publications_form.save()

resource_form = ResourceForm(request.POST)
if resource_form.is_valid():
    resource = resource_form.save(commit=False)
    resource.product = saved_publication
    resource.save()

已保存的\u出版物
是一个
产品
对象。为什么要将其设置为
ResourceForm
的实例?另外,您在哪里查看代码?您拥有的代码只是表单代码。我可能错了,但我正在使用该实例,因为它是产品资源中的外键。我的观点相当广泛。它的哪些部分在这里会有帮助?不,
instance
是一个将预填充表单以进行编辑的对象。由于
ResourceForm
是用于创建
ProductResource
s的表单,因此使用
Product
模型“预先填充”它是没有意义的。我将发布一个答案,因为我无法将所有内容都放在这里。因此,这就是我现在的观点:resource\u form=ResourceForm(request.post),如果resource\u form.is\u valid():resource=resource\u form.save(commit=False)resource.product=saved\u publication resource.save()其他:打印资源\u form.errors资源\u form.errors给我:
  • 产品
    • 这个字段是必需的。
    你是否在
    资源表中添加了
    排除=['product']
    ?啊,是的,我忘了。这个错误现在已经消失了,但我从resource\u form.errors获得的“
    • 资源
      • 值u”[u';Staff';]”不是一个有效的选择。Staff是资源字段的有效选项之一。您将资源字段的
        选项设置为
        (('A','A'),('B','B'),('C','C'),('D','D'),('E','E'))
        'Staff'
        不是其中之一。我遗漏了什么吗?A、B、C、D、E是我的值的占位符。这就是选项实际设置的内容:选项=(‘海怪’、‘海怪’)、(‘鹦鹉螺’、‘鹦鹉螺’)、(‘达特’、‘达特’、(‘KFS’、‘KFS’)、(‘孩子’、‘孩子’、(‘灯塔’、‘灯塔’)、(‘工作人员’、‘工作人员’)打印资源表单和资源表单。错误如下: