Добавление другого поля выбора в интерфейс администратора django

Так что в одном приложении у меня есть четыре модели. От первого до последнего они называются "марка", "марка", "тип", "двигатель".

У Марка есть внешний ключ для марки, у типа - внешний ключ для маркировки, а у двигателя - один для ввода.

В интерфейсе администратора, когда я добавляю отметку, я получаю выпадающий список для выбора из всех брендов. Когда я добавляю тип, я получаю выпадающий список для выбора из всех марок.

Что я хочу: когда я добавляю тип, я также хочу иметь возможность выбрать марку из выпадающего списка и этот выбор, чтобы отфильтровать следующий выпадающий список из меток.

из django.contrib импорт admin из.models import a_brand, b_mark, c_type, d_engine из.forms import 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.

Это немного сбивает с толку, чтобы объяснить.

0 ответов

Другие вопросы по тегам