2012-06-26 158 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領域。

相關問題