Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django管理员,具有多对多选项_Django_Django Models_Django Admin - Fatal编程技术网

Django管理员,具有多对多选项

Django管理员,具有多对多选项,django,django-models,django-admin,Django,Django Models,Django Admin,我有以下models.py和admin.py文件。其目的是在必要时为给定产品选择多个类别 型号.py class Product(models.Model): organization = models.ForeignKey(Organization) name = models.CharField(max_length=50) brief = models.CharField(max_length=100) descrip = models.TextField(

我有以下
models.py
admin.py
文件。其目的是在必要时为给定产品选择多个类别

型号.py

class Product(models.Model):
    organization = models.ForeignKey(Organization)
    name = models.CharField(max_length=50)
    brief = models.CharField(max_length=100)
    descrip = models.TextField(max_length=1300)
    categories = models.ManyToManyField('Product_Category')

class Product_Category(models.Model):
    cats = {"AUT":"Automation", "PWA":"Personal Wealth Advisory", 
            "BCH":"Blockchain", "LOS":"Loan Origination", "FX":"Foreign Exchange"}
    choices = tuple((human, c) for human, c in cats.items())
    name = models.CharField(max_length=32, choices=choices)
 from .models import Product, Product_Feature, Organization, Product_Category

class PFeatureInLine(admin.StackedInline):
    model = Product_Feature
    extra = 1

class ProductForm(forms.ModelForm):
    logo_file = forms.ImageField()

    def save(self, commit=True):
        logo_file = self.cleaned_data.get("logo_file", None)
        self.instance.logo = b64encode(logo_file.read()).decode("utf-8")
        return forms.BaseModelForm.save(self, commit=commit)

    class Meta():
        exclude = ["logo"]
        model = Product

class ProductAdmin(admin.ModelAdmin):
    form = ProductForm
    inlines = [PFeatureInLine,]

admin.site.register(Product, ProductAdmin)
admin.site.register(Organization)
admin.py

class Product(models.Model):
    organization = models.ForeignKey(Organization)
    name = models.CharField(max_length=50)
    brief = models.CharField(max_length=100)
    descrip = models.TextField(max_length=1300)
    categories = models.ManyToManyField('Product_Category')

class Product_Category(models.Model):
    cats = {"AUT":"Automation", "PWA":"Personal Wealth Advisory", 
            "BCH":"Blockchain", "LOS":"Loan Origination", "FX":"Foreign Exchange"}
    choices = tuple((human, c) for human, c in cats.items())
    name = models.CharField(max_length=32, choices=choices)
 from .models import Product, Product_Feature, Organization, Product_Category

class PFeatureInLine(admin.StackedInline):
    model = Product_Feature
    extra = 1

class ProductForm(forms.ModelForm):
    logo_file = forms.ImageField()

    def save(self, commit=True):
        logo_file = self.cleaned_data.get("logo_file", None)
        self.instance.logo = b64encode(logo_file.read()).decode("utf-8")
        return forms.BaseModelForm.save(self, commit=commit)

    class Meta():
        exclude = ["logo"]
        model = Product

class ProductAdmin(admin.ModelAdmin):
    form = ProductForm
    inlines = [PFeatureInLine,]

admin.site.register(Product, ProductAdmin)
admin.site.register(Organization)
当通过admin访问
产品
对象时,会产生以下结果:


您需要这样显示吗

我建议您使用
FilteredSelectMultiple

from django import forms
from django.contrib import admin
from django.contrib.admin.widgets import FilteredSelectMultiple

from .models import Product, Product_Feature, Organization, Product_Category


class ProductForm(forms.ModelForm):
    logo_file = forms.ImageField()

    categories = forms.ModelMultipleChoiceField(
          queryset=Product_Category.objects.all(),
          required=False,
          widget=FilteredSelectMultiple(
              verbose_name=_('Categories'),
              is_stacked=False
          )
    )

    def __init__(self, *args, **kwargs):
        super(ProductForm, self).__init__(*args, **kwargs)

        if self.instance and self.instance.pk:
            self.fields['categories'].initial = self.instance.categories.all()

    def save(self, commit=True):
        logo_file = self.cleaned_data.get("logo_file", None)
        self.instance.logo = b64encode(logo_file.read()).decode("utf-8")
        return forms.BaseModelForm.save(self, commit=commit)

    class Meta:
        exclude = ['logo']
        model = Product


class ProductAdmin(admin.ModelAdmin):
    form = ProductForm
    inlines = [PFeatureInLine,]

谢谢你。我有FilteredSelectMultiple小部件,但是它没有显示任何已定义的类别,它还是空白的。看这里:啊,好的。所以我需要在每一个类别中做一个?您知道如何更改此处的显示,使其成为类别的名称,而不是
Product\u category object
:您应该为python3创建
def\uu str\uuuuuuuuuuuuuself(self):return self.name
,或为python2创建
def\uuuuuuuuuuuuuuuuuuuuuuuuself:return.name
,在
models.py中的class
Product\u类别
的类内
谢谢,这很有意义。这是否意味着,每当我添加一个新类别时,我都需要先创建该类别的实例,然后才能将其视为可用于过滤器小部件?