如果我创建一个新模型,它是另一个的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_horizontal功能之类的东西,我希望有一个ModelMultipleChoiceField包含所有汽车实例。
答案 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