Javascript Django基于其他字段动态设置字段值

Javascript Django基于其他字段动态设置字段值,javascript,django,autocomplete,django-forms,django-admin,Javascript,Django,Autocomplete,Django Forms,Django Admin,我正在尝试根据其他外来字段选择设置字段默认值。 基本上,这些是类: class Product(models.Model): description = models.CharField('Description', max_length=200) price = models.FloatField('Price') class Sell(models.Model): product = models.ForeignKey(Product)

我正在尝试根据其他外来字段选择设置字段默认值。 基本上,这些是类:

class Product(models.Model):
        description = models.CharField('Description', max_length=200)
        price = models.FloatField('Price')

class Sell(models.Model):
        product = models.ForeignKey(Product)
        price = models.FloatField('Price')
每个“产品”都有一个默认价格(或建议价格),因此,当用户在管理页面中想要添加新的销售并且他/她选择了一个产品时,我需要动态地从Product.price复制到Sell.price建议价格。 我不能使用“保存”方法,因为用户可以在那一刻更改


有必要显式使用JavaScript吗?或者Django中有一种优雅的方法可以做到这一点吗?

您可以通过预保存钩子或覆盖Sell模型的save()方法来解决这个问题

from django.db import models

class Product(models.Model):
    description = models.CharField('Description', max_length=200)
    price = models.FloatField('Price')

class Sell(models.Model):
    product = models.ForeignKey(Product)
    price = models.FloatField('Price')

    # One way to do it:
    from django.db.models.signals import post_save
    def default_subject(sender, instance, using):
        instance.price = instance.product.price
    pre_save.connect(default_subject, sender=Sell)

    # Another way to do it:
    def save(self, *args, **kwargs):
        self.price = self.product.price
        super(Sell, self).save(*args, **kwargs)

您是否询问动态更新管理员网页中的表单字段值?客户端表单行为需要在JavaScript中发生。Django的Admin确实提供了一些脚本,特别是用于添加/删除内联线的脚本,但它不提供此级别的功能

Django的管理员在
window.Django.jQuery
下的页面上下文中提供jQuery(或者只是
Django.jQuery
)。Django表单始终输出稳定的表单字段ID。检查输出表单代码,找到产品选择器和相应的Sell.price输入字段。然后,您可以使用jQuery向产品选择器添加一个或处理程序,并使用一个函数更新Sell字段上的价格

作为将来的参考,Django管理员几乎满足了您的请求,但是

预填充的_字段不接受DateTimeField、ForeignKey或 许多领域


另一种方法是初始化模型的
clean()
方法中的
price
字段。非常类似于重写
save()
,但由于不必调用
super()
,因此更简洁,而且它是专为此设计的框架挂钩:)