2012-08-06 70 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); 
    }); 
});