@Lika007

Как представить модели модели и сформировать представление в admin?

Доброе время суток. Хочу создать каталог товаров, в котором будут категории - и в соответствии с выбранной категорией в продукт должны подставляться дополнительные поля (кофе(категория) - сорт, обжарка, кислинка(доп поля только для категории "кофе"); чай - способ приготовления, еще что-то(только для категории "чай")). Идея в том, чтобы в админке при добавлении нового продукта, при выборе в нем категории появлялись эти доп поля. Но у меня так не выходит... я не знаю как мне реализовать подстановку полей из Characteristic(models.Model)-название поля и CharacteristicValue(models.Model) - занести туда значение. Прошу подсказки, что дальше делать, как смотреть. Опыта у меня нет - поэтому надеюсь на может кто-нибудь приоткроет тайну..... буду рада ссылкам, примерам, алгоритмам, всему...

Что есть сейчас:

файл models.py

from django.db import models


class Category(models.Model):
    name = models.CharField(max_length=100, db_index=True)
    slug = models.SlugField(max_length=100, db_index=True, unique=True)
    parameter = models.ManyToManyField("Characteristic", blank=True)

    class Meta:
        ordering = ('name',)
        verbose_name = 'Категория'
        verbose_name_plural = 'Категории'

    def __str__(self):
        return self.name


class Characteristic(models.Model):
    name = models.CharField(max_length=50)
    slug = models.SlugField(max_length=50, db_index=True, unique=True)
    category_name = models.ForeignKey(Category, related_name='category_characteristic', on_delete=models.PROTECT)

    def __str__(self):
        return self.name


class Product(models.Model):
    category = models.ForeignKey(Category, related_name='products', on_delete=models.CASCADE)
    name = models.CharField(max_length=200, db_index=True)
    slug = models.SlugField(max_length=200, db_index=True)
    title = models.CharField(max_length=200, default='some_product')
    image = models.ImageField(upload_to='products/%Y/%m/%d', blank=True)
    description = models.TextField(blank=True)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    discount = models.DecimalField(max_digits=2, decimal_places=0, blank=True)
    stock = models.PositiveIntegerField()
    available = models.BooleanField(default=True)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

    class Meta:
        ordering = ('name', 'category')
        index_together = (('id', 'slug'),)

    def __str__(self):
        return self.name


class CharacteristicValue(models.Model):
    characteristic_id = models.ForeignKey(Characteristic, related_name='character_value', on_delete=models.PROTECT)
    product_id = models.ForeignKey(Product, related_name='characteristic_product', on_delete=models.PROTECT)
    value = models.CharField(max_length=200, db_index=True)

    def __str__(self):
        return self.value


файл admin.py

from django.contrib import admin
from .models import Category, Product, Characteristic, CharacteristicValue

class CategoryAdmin(admin.ModelAdmin):
    list_display = ['name', 'slug']
    prepopulated_fields = {'slug': ('name',)}
admin.site.register(Category, CategoryAdmin)

class CharacteristicsAdmin(admin.ModelAdmin):
    list_display = ['name', 'category_name']
    prepopulated_fields = {'slug': ('name',)}
admin.site.register(Characteristic, CharacteristicsAdmin)

class CharacteristicValueAdmin(admin.ModelAdmin):
    list_display = ['name']
admin.site.register(CharacteristicValue, CharacteristicValueAdmin)

class ProductAdmin(admin.ModelAdmin):
    search_fields = ("name__startswith",)
    list_display = ['name', 'slug', 'category', 'price', 'stock', 'available', 'created', 'updated']
    list_filter = ['category', 'available', 'created', 'updated']
    list_editable = ['price', 'stock', 'available']
    prepopulated_fields = {'slug': ('name',)}
admin.site.register(Product, ProductAdmin)


Схема:

63877d914275a568153643.png
  • Вопрос задан
  • 30 просмотров
Пригласить эксперта
Ответы на вопрос 1
@bacon
По простому такое не сделать, нужно править шаблоны админки и плюсом писать js код (ну и обработку его запросов на сервере). Так что, либо искать готовые библиотеки, которые такое сделали (не уверен что они есть, но я сильно и не исследовал этот вопрос), либо писать полностью свое решение без привязки к стандартной админке.

PS а так, можно глянуть https://github.com/jazzband/django-eav2 может у них реализована какая интеграция подобного в админке
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы