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


您可以使用预保存钩子或重写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确实提供了一些脚本,特别是添加/删除Inline,但它不提供这个级别的功能。

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

为了将来的参考,Django Admin几乎可以通过ModelAdmin.prepopulated_fields满足您的请求

prepopulated_fields不接受DateTimeField,ForeignKey和ManyToManyField字段。

链接地址: http://www.djcxy.com/p/61027.html

上一篇: Django set field values dynamically based on other fields

下一篇: How to align a checkbox and a text input tag into a jquery