2013-02-18 28 views
6

嗨,Django管理:更新内嵌基于其他直列

在管理面板,我创建的形式添加产品。表单包含2个内联表单,因为有些与产品相关的模型。用户可以创建产品,然后定义该产品的不同属性。我会举例说明这一点。用户拥有3种不同颜色的一个品牌的T恤,并希望以不同的价格添加它们。 T恤被创建为具有3种变体的产品。

class Detail(models.Model): 
    product = models.ForeignKey('Product') 
    attribute = models.ForeignKey('Attribute') 
    value = models.CharField(max_length=500) 

class Attribute(models.Model): 
    name = models.CharField(max_length=300) 

class Variant(models.Model): 
    product = models.ForeignKey(Product) 
    details = models.ManyToManyField(Detail) 
    quantity = models.IntegerField() 
    price = models.DecimalField(max_digits=6, decimal_places=2) 

我省略了产品,因为它是无关紧要的。

class DetailInline(admin.TabularInline): 
    model = Detail 

class VariantInline(admin.StackedInline): 
    model = Variant 

class ProductAdmin(admin.ModelAdmin): 
    class Meta: 
     model = Product 

    inlines = [DetailInline, VariantInline] 

这很好地工作,模型保存良好,我有一个问题与变体内联。变体内联显示详细对象,但只有已保存在数据库中的对象。为了让用户更容易生活,最好的方法是在创建Detail对象时将Detail对象添加到Variant inline中,因此它必须在保存Product之前发生。

  • 有没有办法用值手动刷新内联?
  • 是否有一个中期保存我可以用来创建明细对象但不是产品并返回结果?
  • 模型应该重新设计? (我真的不想这样做,除非我必须这样做)
  • 用户在添加产品时是否需要遵循不同的工作流程?

我试图通过使用js注入条目到内联,但这是hackish和Django没有验证与假值错误输入错误的值已被选中。

我写这个问题时脑海中浮现出的最后想法。可以创建js,以防万一Inline对象的内联形式被改变时会将数据传递给自定义视图,从而创建对象并返回结果。我看到的一个问题(在它旁边感觉不对)是如何通知django新对象创建的,因此它不会提出关于不存在的值的错误。

无论如何,我希望有人会理解这个长问题。

+0

你绑详细到产品,而不是要变,对任何具体的原因? – 2013-02-25 07:10:09

+0

是的,我。它用于通过js过滤数据。 – 2013-02-25 17:30:38

回答

2

想到的一件事是Knockout.js

它非常适合同时更新DOM中的许多元素,并且您可以轻松地使用来自客户端事件的Ajax调用将新值返回到自定义视图。

有几个框架,可以做到这一点,但我认为这是淘汰赛的一个更容易阅读和最流行的像骨干,棱角分明,灰烬的实施等

的Django通常会抱怨动态添加选项,但只要它们在验证表单时存在于服务器端,理论上应该没问题。

+0

是的,它不会抱怨内嵌的新对象。但是我仍然有问题,因为我的Detail需要参考产品。我比较接近,但还没有。 – 2013-02-20 18:00:51

+0

听起来像你在路上。 – Brandon 2013-02-20 19:14:47

0

我决定放弃这个想法,因为它已经花费了很多时间,可能会花费更多。另外我想出的是比编码更令人讨厌的黑客行为。但是,不要把这个挂在这里挂我会发布给其他人的任何提示。

我有两个不同的模型为内联表单集模型,它们都有主力车型的外键,其中一人有其他的外键。想法是根据用户输入的值在一个内联中创建假条目。正如它所表现的那样,使用jQuery随Django一起发布很容易。所以我做了,但当然,Django知道这个模型不存在。解决方案是创建我自己的表单和字段,并重写clean()方法,就像我做的那样here

这导致了很多问题,其中一部分是我的模型依赖于彼此和现场的清洁卫生()方法不得不砍掉一点点不为db对象存在的检查。除此之外,由于缺少有关POST数据的字段验证阶段的信息,所以必须覆盖clean()方法的形式,因为已经发布了数据。然而,它是不洁的,因此不得不从POST字典中提取和验证。此时我决定停下来,因为它越来越复杂,可能导致数据不一致。我猜测,下一步将覆盖保存的ModelAdmin的方法创建的对象是不是在查询集绑FORMSET,除非有一个地方的地方在哪里可以做的方式。

总结这一点,我不得不说,在这一点上我绝不会做这种方式,用更好地控制数据流的我自己的看法change_form去。

TL;博士

创建自定义视图change_form。