【问题标题】:django InlineAdmin: Fill Field Value after a Select-Change (ForeignKey)django InlineAdmin:选择更改后填充字段值(外键)
【发布时间】:2015-11-10 15:02:44
【问题描述】:

模型和管理类

class ListItem(models.Model):
        quantity = models.IntegerField(default=1)
        isKleinmenge = models.BooleanField(default=False)
        product = select2.fields.ForeignKey(ProductVariant, blank=True, null=True, overlay="Produkt...")
        sortOrder = models.PositiveIntegerField(default=0, blank=False, null=False)

        invoicePrice = models.FloatField(default=0)
        invoiceText = models.TextField(default="", blank=True, null=True)

我将该模型用作发票上的内联。

class ProductsInline(SortableInlineAdminMixin, admin.TabularInline):
        model = ListItem

在我的发票上

class InvoiceAdmin(DjangoObjectActions, admin.ModelAdmin):
    inlines = [ ProductsInline, ]

问题 djangoAdmin 内部:当通过下拉列表(在 ListItem 内联元素中)选择产品时,我想将所选产品中的文本/值复制到“invoiceText”和“invoicePrice”中。

想法是最终用户可以在需要/必须时更正 invoiceText 和 invoicePrice。

我该怎么做? 如何检测 Select Form 中的变化并做出反应?

【问题讨论】:

    标签: django django-admin


    【解决方案1】:

    一个解决方案可以使用jquery

    add jquery to product admin :
    
    class InvoiceAdmin(DjangoObjectActions, admin.ModelAdmin):
    inlines = [ ProductsInline, ]
    class Media:
        js = (
            '//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js', # jquery
            'my_script.js'
        )
    

    my_script.js

    $("select#product").change(function() {
        // do what ever you want
    });
    

    【讨论】:

    • 我在管理员中多次做过同样的事情。为使用 Media 类的简单解决方案点赞。
    • 完美干净的解决方案!谢谢!
    • 我不明白为什么这只对我部分有效,jquery 和 my_script.js 已加载,但 $("select#product").change(function() 不起作用.. 也尝试使用 $("select#id_product").change() 根据 django-admin 生成字段,但这也不起作用。使用console.log() 我发现它之前和之后的任何 js 代码都运行良好..
    • 甚至找到了另一个类似的解决方案,但我有同样的问题:simpleisbetterthancomplex.com/tutorial/2018/01/29/…
    【解决方案2】:

    除了哈桑的正确答案: 我实际上(python3-django 2.2.3)有我的 jquery 部分没有运行的问题,因为文档没有完全加载。我发现,django 在文档完成加载之前加载 my_script.js 并且由于之后加载了选择元素而无法工作。所以首先检查$(document).ready() 有效:

    $(document).ready(function(jQuery) {
        jQuery(function($) {
            $('select#id_product').on('change', function() {
                alert('product selection changed.');
            });
        });
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-16
      • 2010-11-29
      • 1970-01-01
      • 2012-02-05
      • 2011-08-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多