从django admin添加与现有实例的反向ForeignKey关系

时间:2018-02-10 12:03:33

标签: django django-admin

如果我创建一个新模型,它是另一个的ForeignKey,我可以在创建新的ForeignKeys时更新现有的“another”实例吗?即,不经过“另一个”每个实例的个别编辑页面?

假设我有一个Car模型,并且我在django admin中创建了一堆Car实例来填充他们的详细信息:

# models.py
from django.db import models

class Car(models.Model):
    make = models.CharField(max_length=200)
    model = models.CharField(max_length=200)
    color = models.CharField(max_length=200)
    ...

一年后,我决定开始向顾客租车:

# models.py
from django.db import models

class Customer(models.Model):
    name = models.CharField(max_length=200)
    ...


class Car(models.Model):
    make = models.CharField(max_length=200)
    model = models.CharField(max_length=200)
    color = models.CharField(max_length=200)
    rented_to = models.ForeignKey(Customer, null=True, on_delete=models.SET_NULL)
    ...

如果我在管理网站注册客户,我可以添加新客户,编辑他们的属性,并使用内联,添加租给该客户的新车:

#admin.py
from django.contrib import admin

from .models import Car, Customer

class CarInline(admin.StackedInline):
    model = Car
    extra = 3


class CustomerAdmin(admin.ModelAdmin):
    inlines = [CarInline]

admin.site.register(Customer, CustomerAdmin)

有没有办法从客户管理页面向客户添加现有的Car实例,而不是点击所有汽车并选择他们的客户?

当我编辑/添加新客户时,或者像M2M字段中的filter_horizo​​ntal功能之类的东西,我希望有一个ModelMultipleChoiceField包含所有汽车实例。

1 个答案:

答案 0 :(得分:0)

您可以在django-admin中创建在Customer视图中显示的自定义表单。

由此定义:

<强> admin.py

from django import forms
...
class CustomerModelForm(forms.ModelForm):
    class Meta:
        model = Customer
        exclude = ('',)

    some_other_field = forms.ChoiceField( ... )

    # override save method to work as expected

@admin.register(Customer)
class CustomerAdmin(admin.ModelAdmin):
    list_display = ('fields_you_want_to_display', )
    form = CustomerModelForm

然后在使用的表单中创建多选字段的功能并覆盖保存方法,它将起作用。您可以根据需要修改管理页面。

https://docs.djangoproject.com/en/2.0/ref/contrib/admin/#adding-custom-validation-to-the-admin