自动为另一个Django应用程序模型字段生成模型字段的值

时间:2018-10-12 08:48:12

标签: python django database sqlite

//App ITEMS APP(1)

class ItemsDetail(models.Model):
    name = models.CharField(max_length=100,unique=True)
    sellPrice = models.FloatField()
    costPrice = models.FloatField()
    quantity = models.IntegerField()

//App ORDERS (APP 2)

class Order(models.Model):
    name = models.CharField(max_length=100)
    item = models.ForeignKey(
        ItemsDetail,
        on_delete=models.CASCADE,
        to_field='name',
        blank=True,
    )

    price = models.FloatField()

现在,当用户在管理界面中从下拉列表中选择Order.item时,我希望Order.price的值为ItemsDetail.sellPrice

admin interface of Orders. Want to generate value for price according to item selected

2 个答案:

答案 0 :(得分:0)

您别无选择。

首要选择-只需在模型中更改__str__

喜欢这个。

class ItemsDetail(models.Model):
    name = models.CharField(max_length=100,unique=True)
    sellPrice = models.FloatField()
    costPrice = models.FloatField()
    quantity = models.IntegerField()

    def __str__(self):
        return self.sellPrice

但是,如果您想将__str__用于其他字段,则无法使用此方法。

第二,您可以覆盖formfield_for_foreignkey本身。

class ItemsChoiceField(forms.ModelChoiceField):
     def label_from_instance(self, obj):
         return "Item: {}".format(obj.name)


class YourOrderAdmin(admin.ModelAdmin):
    ...
    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == 'item':
            return ItemsChoiceField(queryset=ItemsDetail.objects.all())
        return super().formfield_for_foreignkey(db_field, request, **kwargs)

有关更多详细信息,请检查django admin cookbook

答案 1 :(得分:0)

您好,您必须重写django管理模板,方法是在模板内部创建admin文件夹,然后在模型名称文件夹中创建可以创建change_form.html的文件夹。另外,您必须编写有关值更改的javascript代码

{% block admin_change_form_document_ready %}
<script type="text/javascript">
    (function($) {
        $(document).ready(function() {
            $('.add-another').click(function(e) {
                //set the value manually.
        });
    })(django.jQuery);
</script>

{%endblock%}