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]

もちろん、これは発生します。これは、が欠落しているValidationErrorためです。AlternativeProductcategory

これで、デフォルト値を設定してそれを修正できます。

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を変更しようとしましたが、ハックになります。javascriptの方が時間のかからないアプローチですが、おそらくカスタムビューが良い解決策になるでしょう。

4

1 に答える 1

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);
    });
});
于 2012-08-06T15:12:36.870 に答える