したがって、1 つのアプリに 4 つのモデルがあります。最初から最後まで、名前は「ブランド」、「マーク」、「タイプ」、「エンジン」です。
Mark には brand への外部キー、type には mark への外部キー、engine には type への外部キーがあります。
管理インターフェイスでマークを追加すると、すべてのブランドから選択するドロップダウン リストが表示されます。タイプを追加すると、すべてのマークから選択するドロップダウン リストが表示されます。
私が欲しいもの: タイプを追加するときに、ドロップダウン リストからブランドを選択し、その選択によって、マークから次のドロップダウンをフィルタリングできるようにしたいと考えています。
django.contrib から .models から admin をインポート .forms から a_brand、b_mark、c_type、d_engine をインポート TypeModelAdminForm をインポート
これらは私のモデルです
from django.db import models
class a_brand(models.Model):
brand_name = models.CharField(max_length=250, unique=True)
brand_logo = models.ImageField(
upload_to='C:/Users/Robert/Desktop/carsbook/static/catalog/brandslogos'
)
class Meta:
ordering = ['brand_name']
def __str__(self):
return self.brand_name
class b_mark(models.Model):
mark_brand = models.ForeignKey(a_brand, on_delete=models.CASCADE)
mark_name = models.CharField(max_length=250)
mark_image = models.ImageField(
upload_to='C:/Users/Robert/Desktop/carsbook/static/catalog/marksimages',
default='C:/Users/Robert/Desktop/carsbook/static/default/default.jpg'
)
class Meta:
unique_together = ("mark_brand", "mark_name")
ordering = ['mark_brand', 'mark_name']
def __str__(self):
return self.mark_name
class c_type(models.Model):
type_mark = models.ForeignKey(b_mark, on_delete=models.CASCADE)
type_name = models.CharField(max_length=250)
type_image = models.ImageField(
upload_to='C:/Users/Robert/Desktop/carsbook/static/catalog/typesimages',
default='C:/Users/Robert/Desktop/carsbook/static/default/default.jpg'
)
class Meta:
unique_together = ("type_mark", "type_name")
ordering = ['type_mark', 'type_name']
def __str__(self):
return self.type_name
class d_engine(models.Model):
engine_type = models.ForeignKey(c_type, on_delete=models.CASCADE)
engine_name = models.CharField(max_length=250)
class Meta:
unique_together = ("engine_type", "engine_name")
ordering = ['engine_type', 'engine_name']
def __str__(self):
return self.engine_name
これは私のadmin.pyにあるものです
from django.contrib import admin
from .models import a_brand, b_mark, c_type, d_engine
from .forms import TypeModelAdminForm
class b_markModelAdmin(admin.ModelAdmin):
list_display = ["brand", "__str__"]
search_fields = ["mark_brand__brand_name", "mark_name"]
list_display_links = ["__str__"]
class Meta:
model = b_mark
def brand(self, instance):
return instance.mark_brand
class c_typeModelAdmin(admin.ModelAdmin):
form = TypeModelAdminForm
list_display = ["brand", "type_mark", "__str__"]
search_fields = ["type_name", "type_mark__mark_name", "type_mark__mark_brand__brand_name"]
list_display_links = ["__str__"]
class Meta:
model = c_type
def brand(self, instance):
return instance.type_mark.mark_brand
def mark(self, instance):
return instance.type_mark
class d_engineModelAdmin(admin.ModelAdmin):
list_display = ["brand", "mark", "type", "__str__"]
search_fields = [
"engine_name",
"engine_type__type_name",
"engine_type__type_mark__mark_name",
"engine_type__type_mark__mark_brand__brand_name"
]
list_display_links = ["__str__"]
class Meta:
model = d_engine
def brand(self, instance):
return instance.engine_type.type_mark.mark_brand
def mark(self, instance):
return instance.engine_type.type_mark
def type(self, instance):
return instance.engine_type
admin.site.register(a_brand)
admin.site.register(b_mark, b_markModelAdmin)
admin.site.register(c_type, c_typeModelAdmin)
admin.site.register(d_engine, d_engineModelAdmin)
管理サイトで c_type または d_engine モデルを追加すると、「上位」モデルの外部キーを選択できるだけでなく、ブランド、マーク、エンジンに基づいてそれらをフィルタリングできます。
たとえば、en d_engine を追加する場合、すべてのタイプ、すべてのマーク、すべてのブランドから外部キーを選択する必要があります。代わりに、最初にブランドを最初に選択し、フィルターするために選択したブランド、次のマークのドロップダウン リスト、次に選択したマークを選択して、タイプをフィルター処理し、次に c_type を選択します。
説明するのはちょっとややこしいです。