假设我的django模型看起来像这样:
class Order(models.Model):
number = models...
date = models...
class OrderLine(models.Model):
# One or more lines per order
order = models.ForeginKey(Order)
common_line = models.OneToOneField(CommonLine)
class CommonLine(models.Model):
# common elements of what might be on a line item...
taxes = model...
amount = model...
我想创建一个使用inlineformset的表单来编辑每个订单的一个或多个行(OrderLine和CommonLine)。
我可以创建一个与Order和OrderLine一起使用的formset - 但是如何在显示formset时让内联formset为我提供CommonLine类中的所有详细项目。内联表单集的文档似乎需要内联表单 - 订单上的多行只能映射到单个类...
我没有看到文档中的内容吗?我敢肯定我可以覆盖一些东西,我只是不确定在哪里。
感谢您的帮助......
答案 0 :(得分:2)
我用http://yergler.net/blog/2009/09/27/nested-formsets-with-django/解决了问题。请在forms.py文件中使用以下更正:
instance=None
pk_value = hash(form.prefix)
+ correct_data = None
+ if (self.data):
+ correct_data = self.data;
# store the formset in the .nested property
form.nested = [
- TenantFormset(data=self.data,
+ TenantFormset(data=correct_data,
instance = instance,
很好地处理Django 1.4.1。
答案 1 :(得分:1)
需要做一些小的改动才能让Nathan在http://yergler.net/blog/2009/09/27/nested-formsets-with-django/的代码在Django 1.3中工作。下面的行导致ManagementForm错误。
TenantFormset = inlineformset_factory(models.Building, models.Tenant, extra=1)
使用modelformset_factory并手动定义查询集似乎有效,但我没有实现添加额外内容的功能。
TenantFormset = modelformset_factory(models.Tenant, extra=0)
form.nested = [
TenantFormset(
queryset = Tenant.objects.filter(building = pk_value),
prefix = 'value_%s' % pk_value
)
]
我还必须手动将数据传递给is_valid方法中的子子表单:
def is_valid(self):
result = super(BaseProtocolEventFormSet, self).is_valid()
for form in self.forms:
if hasattr(form, 'nested'):
for n in form.nested:
n.data = form.data
if form.is_bound:
n.is_bound = True
for nform in n:
nform.data = form.data
if form.is_bound:
nform.is_bound = True
# make sure each nested formset is valid as well
result = result and n.is_valid()
return result
编辑:
可以使用jQuery创建新实例。见this question:
答案 2 :(得分:0)
这听起来与在帮助http://yergler.net/blog/2009/09/27/nested-formsets-with-django/谈到的方法非常相似,Nathan写道他如何迎合“多层次数据模型;这种模型的一个例子是建模城市街区,每个Block有一个或多个建筑物,每个建筑物都有一个或多个租户。“
此处还可以找到更多解释Django Forms Newbie Question