我正在尝试根据外来的其他字段选择设置字段默认值。 基本上,这些是类:
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动态复制到卖出价格建议的价格。 我不能使用“保存”方法,因为用户可以在那一刻进行更改。
是否有必要明确使用JavaScript?或者Django有一种优雅的方式吗?
答案 0 :(得分:3)
您可以使用预保存挂钩或覆盖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)
答案 1 :(得分:1)
您是否要求在管理员网页中动态更新表单字段值?客户端表单行为需要在JavaScript中发生。 Django的Admin确实提供了一些脚本,特别是添加/删除内联,但它不提供此级别的功能。
Django的Admin确实在window.django.jQuery
(或django.jQuery
)下的页面上下文中提供了jQuery。 Django Forms总是输出稳定的表单字段ID。检查输出表单代码并找到Product选择器和相应的Sell.price输入字段。然后你可以使用jQuery做一些事情,比如在Product选择器中添加.change()或.on('change', ...)处理程序,并使用一个更新Sell字段价格的函数。
为了将来参考,Django Admin几乎可以通过ModelAdmin.prepopulated_fields但
完成您的请求prepopulated_fields不接受DateTimeField,ForeignKey,也不接受 ManyToManyField字段。