Измените поле формы администратора на настраиваемое - PullRequest
0 голосов
/ 14 июля 2020

У меня есть Category модель

class Category(models.Model):
    name = models.CharField(max_length=120,default='', verbose_name=_('name'))
    color = ColorField(default='#FF0000')

и Product модель

class Product(models.Model):
     name = models.CharField(max_length=120)
     category = models.ForeignKey(Category, on_delete=models.CASCADE, default=None)
     ...

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

Мне удалось создать цветное поле категории на моей странице администратора: введите описание изображения здесь

Это код (добавлен в product / admin.py):

class SelectWOA(Select):
    def create_option(self, name, value, label, selected, index, 
                      subindex=None, attrs=None):
        option_dict = super(SelectWOA, self).create_option(name, value, 
            label, selected, index, subindex=subindex, attrs=attrs)
            #Category.objects.
        try:
            option_dict['attrs']['style'] =  'color: ' +  Category.objects.get(name=label).color + ';' 
        except:
            pass
            
        return option_dict

from django.forms import ChoiceField, ModelChoiceField
from category.models import Category
class ProductAdminForm(ModelForm):
    test_field = ModelChoiceField(queryset=Category.objects.all(), widget=SelectWOA())
    class Meta:
        model = Product
        exclude = ['category']
        fields = ('name', 'image', 'image2', 'category', 'test_field',)





from django.db import models
class ProductCastumAdmin(admin.ModelAdmin):
    form = ProductAdminForm

, но test_field не знает, что я хочу, чтобы он «подключился» к category и замените его. Поэтому, когда я сохраняю форму, данные, которые я помещаю в test field, не сохраняются как категория. У меня вопрос: после того, как я исключил поле категории, как я могу заменить его на test field, чтобы можно было сохранить данные, как если бы это было поле категории?

1 Ответ

0 голосов
/ 16 июля 2020

Итак, с большой помощью @Blackdoor это мое решение: Спасибо!

# select that change the color of the option based on the category of the product
class SelectWOA(Select):
    def create_option(self, name, value, label, selected, index, 
                      subindex=None, attrs=None):
        option_dict = super(SelectWOA, self).create_option(name, value, 
            label, selected, index, subindex=subindex, attrs=attrs)
            #Category.objects.
        try:
            option_dict['attrs']['style'] =  'color: ' +  Category.objects.get(name=label).color + ';' 
        except:
            pass
            
        return option_dict

from django.forms import ChoiceField, ModelChoiceField
from category.models import Category

class ProductAdminForm(ModelForm):
    category = ModelChoiceField(queryset=Category.objects.all(), widget=SelectWOA())
    class Meta:
        model = Product
        fields = ('name', 'image', 'image2', 'category',)


from django.db import models
class ProductCastumAdmin(admin.ModelAdmin):
    form = ProductAdminForm
    formfield_overrides = {
        models.ForeignKey: {'widget': SelectWOA},
    }
    fields = ( 'name', 'image', 'image2', 'category')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...