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给我:- 产品
- 这个字段是必需的。
资源表中添加了
?啊,是的,我忘了。这个错误现在已经消失了,但我从resource\u form.errors获得的“排除=['product']
- 资源
- 值u”[u';Staff';]”不是一个有效的选择。Staff是资源字段的有效选项之一。您将资源字段的
选项设置为
(('A','A'),('B','B'),('C','C'),('D','D'),('E','E'))
不是其中之一。我遗漏了什么吗?A、B、C、D、E是我的值的占位符。这就是选项实际设置的内容:选项=(‘海怪’、‘海怪’)、(‘鹦鹉螺’、‘鹦鹉螺’)、(‘达特’、‘达特’、(‘KFS’、‘KFS’)、(‘孩子’、‘孩子’、(‘灯塔’、‘灯塔’)、(‘工作人员’、‘工作人员’)打印资源表单和资源表单。错误如下:'Staff'
- 值u”[u';Staff';]”不是一个有效的选择。Staff是资源字段的有效选项之一。您将资源字段的