2012-06-26 120 views
7

我试图根据其他外地字段选择来设置字段默认值。 基本上,这些都是类:Django基于其他字段动态设置字段值

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中有没有一种优雅的方式来做到这一点?

回答

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

另一种方法是在模型的clean()方法中初始化'price'字段。很像重写'save()',但由于不必调用'super()'而变得更清洁,并且它是专门为此设计的框架钩子:) –

1

您是否在动态更新Admin网页中的表单域值?客户端表单行为需要在JavaScript中发生。 Django的Admin确实提供了一些脚本,特别是添加/删除Inline,但它不提供这个级别的功能。

Django的管理员确实在页面上下文中提供了jQuery(window.django.jQuery)(或只是django.jQuery)。 Django Forms始终输出稳定的表单域ID。检查输出表单代码并找到产品选择器和相应的Sell.price输入字段。然后,您可以使用jQuery来执行某些操作,例如将一个.change().on('change', ...)处理程序添加到产品选择器,并使用更新Sell字段价格的函数。

以供将来参考,Django管理几乎满足与ModelAdmin.prepopulated_fields

prepopulated_fields您的要求不接受DateTimeField字段,ForeignKey的,也不 ManyToManyField领域。

相关问题