【问题标题】:Edit field from ForeignKey in Admin在 Admin 中编辑 ForeignKey 字段
【发布时间】:2014-05-15 16:17:19
【问题描述】:
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)
如何在Box 单对象管理页面中添加编辑BoxItem.quantity 值的可能性?
【问题讨论】:
标签:
python
django
django-models
django-admin
django-modeladmin
【解决方案1】:
在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 实例相关联。在一个BoxItem 中更改quantity 也会影响其他Box 实例,因为它们可以与相同的BoxItem 关联。
(这与管理员无关,无论以何种方式更改为quantity 字段都是如此。)