gpt4 book ai didi

Django 管理员 : update inline based on other inline

转载 作者:行者123 更新时间:2023-12-04 15:45:53 31 4
gpt4 key购买 nike

你好,

在管理面板中,我创建了用于添加产品的表单。表单包括 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)

我省略了 Product,因为它无关紧要。

class DetailInline(admin.TabularInline):
model = Detail

class VariantInline(admin.StackedInline):
model = Variant

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

inlines = [DetailInline, VariantInline]

这很好用,模型保存得很好,我对 Variants inline 有问题。内联变体显示 Detail 对象,但仅显示已保存在数据库中的对象。为了使用户的生活更轻松,最好在创建 Detail 对象时将 Detail 对象添加到 Variant inline,因此必须在保存 Product 之前发生。
  • 有没有办法用值手动刷新内联?
  • 有没有可以用来创建 Detail 对象而不是 Product 并返回结果的中间保存?
  • 模型应该重新设计吗? (我真的不想这样做,除非我必须这样做)
  • 用户是否需要遵循不同的工作流程来添加产品?

  • 我曾尝试使用 js 将条目注入(inject)内联,但这是 hackish 并且 Django 没有验证带有假值的表单集,抛出错误,即选择了错误的值。

    在我写这个问题时,我想到的最后想法。可以创建 js,以防万一对象的内联形式发生更改,会将数据传递给自定义 View ,该 View 将创建对象并返回结果。我看到的一个问题(除了感觉不对)是如何通知 django 创建了新对象,这样它就不会引发关于不存在值的错误。

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

    最佳答案

    想到的一件事是Knockout.js .

    它非常擅长同时更新 DOM 中的许多元素,并且您可以使用来自客户端事件的 Ajax 调用轻松地将新值推送回您的自定义 View 。

    有几个框架可以做到这一点,但我认为 Knockout 是 Backbone、Angular、Ember 等最受欢迎的框架中更容易阅读和实现的框架之一。

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

    关于Django 管理员 : update inline based on other inline,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14945001/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com