从管理员中的外键编辑字段

时间:2014-04-03 17:05:26

标签: python django django-models django-admin django-modeladmin

class BoxItem(models.Model):
    quantity = models.IntegerField()

class Box(models.Model):
    name = models.CharField(max_lenght=150)
    item = models.ForeignKey(BoxItem)

管理员:

admin.site.register(BoxItem)
admin.site.register(Box)

如何在BoxItem.quantity单个对象管理页面中添加编辑Box值的可能性?

1 个答案:

答案 0 :(得分:3)

admin.py

class BoxAdminForm(forms.ModelForm):
    box_item_quantity = forms.IntegerField()

    def __init__(self, *args, **kwargs):
        """ populate box_item_quantity initial value """
        super(BoxAdminForm, self).__init__(*args, **kwargs)
        if self.instance:
            self.initial['box_item_quantity'] = self.instance.item.quantity

    class Meta:
        model = Box


class BoxAdmin(admin.ModelAdmin):
    form = BoxAdminForm

    def save_model(self, request, obj, form, change):
        super(BoxAdmin, self).save_model(request, obj, form, change)
        obj.item.quantity = form.cleaned_data.get('box_item_quantity')
        obj.item.save()


admin.site.register(Box, BoxAdmin)

这是有效的,因为您的BoxItem字段是必需的。否则,当Box没有BoxItem关联时,可能需要更多逻辑来处理案例。


我必须说,即使它不在问题中:
这个模型架构对我来说非常奇怪。一个BoxItem实例可以与许多Box个实例相关联。更改一个quantity中的BoxItem也会影响其他Box个实例,因为它们可能与同一BoxItem相关联。 (这与管理员无关,无论发生quantity字段的更改方式都是如此。)