2012-08-06 43 views
0

考慮這些僞模式:清潔內聯實例

class Category(models.Model): 
    name = models.CharField() 

class Product(models.Model): 
    name = models.CharField() 
    code = models.CharField() 
    category = models.ForeignKey(Category) 
    price = models.DecimalField() 
    stock = models.IntegerField() 

class AlternativeProduct(Product): 
    original_product = models.ForeignKey(Product, related_name="alternative", editable=False) 

我想用內聯,以便能夠快速添加產品及其替代方案,而無需輸入重複的數據(唯一的代碼,股票和價格分化)。

admin.py

class AlternativeProductInline(admin.TabularInline): 
    model = AlternativeProduct 
    formset = AlternativeProductInlineFormset 
    fk_name = "original_product" 
    fields = ["code", "price", "in_stock"] 
    max_num = 1 
    extra = 0 


class ProductAdmin(admin.ModelAdmin): 
    form = ProductAdminForm 
    inlines = [AlternativeProductInline] 

Ofcourse,這將提高ValidationError,因爲AlternativeProduct缺少category

現在我可以設置一個默認值來解決這個問題:

class Product(models.Model): 
    name = models.CharField() 
    code = models.CharField() 
    category = models.ForeignKey(Category, default=1) 
    price = models.DecimalField() 
    stock = models.IntegerField() 

但除了這個事實這個ID可能不存在,仍然需要加以糾正。是否有任何其他方式(除了使用Javascript)的真正產品的類別值複製到備用聯機產品「引擎蓋下

我曾試圖改變admin_view,但它得到的hackish,也許自定義視圖將是一個不錯的解決方案,儘管JavaScript是一個不太耗時的方法。

+0

我對你的代碼片段有點困惑,特別是'models.py'。你確定在翻譯「僞」模型時沒有遺漏任何東西嗎?特別是,您可以參考'AlternativeProduct'上的字段,這些字段似乎不存在。 – supervacuo 2012-08-06 13:56:13

+0

對不起,錯字,AlternativeProduct派生自產品 – 2012-08-06 14:05:20

+0

'Product'和'AlternativeProduct'有什麼區別?現在看來,他們似乎不應該是兩個單獨的模型。 – 2012-08-06 14:45:15

回答

0

Javascript確實似乎是實現這一點的簡單方法。

$(document).ready(function(){ 
    $('#alternative-group thead th:nth-child(2)').hide(); 
    $('#alternative-group tbody td:nth-child(1) p').hide(); 
    $('#alternative-group tbody td:nth-child(3)').hide(); 
    $('#id_alternative-0-category').hide(); 

    var product_category = $('#id_category option:selected').val(); 
    $('#id_alternative-0-category').val(product_category); 

    $("#id_category").change(function() { 
     product_category = $('#id_category option:selected').val(); 
     $('#id_alternative-0-category').val(product_category); 
    }); 
});