2017-07-26 5 views
2

商品とカテゴリの間に多対多の関係があります。私はmpttを使って管理者のカテゴリの表示を管理しています(これはうまくいきます)ので、カテゴリに商品を割り当てることができます。Django:mptt-djangoを使用して多対多の関係でカテゴリに商品を割り当てます。

カテゴリはうまくいきますが、私は問題を抱えています。私は

from django.forms import CheckboxSelectMultiple 
from .models import Product,ProductCategory 
from django.db import models 
from django.contrib import admin 
from mptt.admin import MPTTModelAdmin 
from mptt.models import TreeManyToManyField 

class ProductAdmin(admin.ModelAdmin): 

    formfield_overrides = { 
     TreeManyToManyField:{'widget':CheckboxSelectMultiple}, 
    } 

持っている私のadmin.pyで

from mptt.models import MPTTModel,TreeForeignKey,TreeManyToManyField 

class ProductCategory(MPTTModel): 
    parent = TreeForeignKey('self', null=True, blank=True) 

class Product(models.Model) 
    categories = TreeManyToManyField(ProductCategory) 

をこれはほとんど仕事を取得しますが、すべてのカテゴリは以下のとおりです。私のmodels.pyで

私は(簡潔にするため切り捨て)していますあなたがサブカテゴリを持つカテゴリに商品を追加したくないので、私が望むものではないチェックボックスで表示されます。私が欲しいもの

enter image description here

あなただけのこの例ではので、子供を持っていないカテゴリに

Category 1 
Category 2 sub sub 
Category 3 sub 

を製品を追加することができ、ラベルがあろうと、このようなカテゴリの表示である

Category 1 
Category 2 > Catgory 2 sub > Category 2 sub sub 
Category 3 > Category 3 sub 

何か助けてくれてありがとうございました!

UPDATE

こんにちは、私は私の質問が広すぎるかもしれ実現!

Django newbieとして、私が行う必要があるのは、CheckboxSelectMultipleウィジェットをオーバーライドする可能性のあるカスタムウィジェットを作成することです。これを私の 'categories'モデル属性に適用できます。

formfield_overrides = { 
    TreeManyToManyField:{'widget':CheckboxSelectMultiple}, 
} 

上述したように現時点では

は、私は、これは望ましい結果をもたらすだけでなく、むしろすべてのTreeManyToManyフィールドの標準CheckboxSelectMultipleを使用するよりもしないだけでなく、TreeManyToManyFieldためformfield_overridesを使用しています私が指定することができますこのウィジェットは私の 'categories'属性のためのものですか?

これにもかかわらず、カテゴリツリーに関する情報と選択された状態(すでにカテゴリに割り当てられている製品用)を渡すカスタムウィジェットを作成する方法を教えてください。私はこれを自分で整理しようとしてきましたが、苦労しています。

KARANTSTHRのCOMMENTここ

カテゴリのスクリーンショットは以下の更新 - 子を持たないカテゴリを示すのすべての良いが、前述したように、私たちは、ラベルにこれらのカテゴリに両親を表示することができますか?

enter image description here

UPDATE 2 KARANTSTHR TO

ここにあなたの実装とスクリーンショットです。

enter image description here

答えて

1

ModelAdminのは非常に柔軟で、あなたはどの子カテゴリを持っていないカテゴリをフィルタリングする(フォームがModelAdminのオプションである)ProductAdminでフォームオプションのカスタムのModelFormを指定することができます。
だから、私はあなたがちょうどあなたが親フィールドにrelated_nameを追加する必要がadmin.py

from django import forms 
from django.forms import CheckboxSelectMultiple 
from .models import Product,ProductCategory 
from django.contrib import admin 
from mptt.admin import MPTTModelAdmin 
from mptt.models import TreeManyToManyField 


class filterCategories(forms.ModelForm): 
    class Meta: 
     model = Product 
     fields = '__all__' 

    def __init__(self,*args,**kwargs): 
     super(filterCategories, self).__init__(*args,**kwargs) 
     self.fields['categories'].queryset = ProductCategory.objects.filter(children=None) 


class ProductAdmin(admin.ModelAdmin): 
    form = filterCategories 
    formfield_overrides = { TreeManyToManyField:{'widget':CheckboxSelectMultiple},} 


admin.site.register(Product,ProductAdmin) 
admin.site.register(ProductCategory,MPTTModelAdmin) 


としてUPDATE 1
を変更、あなたの問題を解決するために、カスタムウィジェット必要はありませんだと思う ProductCategoryクラスの models.py
したがって、models.pyのProductCategoryクラスは次のようになります

これはあなたの選択のラベル(オブジェクトの名前)を得るためのラジカルなアプローチではないことをラベル

def __str__(self): 
    try: 
     ancestors = self.get_ancestors(include_self=True) 
     ancestors = [i.name for i in ancestors] 
    except: 
     ancestors = [self.name] 

    return ' > '.join(ancestors[:len(ancestors) + 1]) 

ノートについては、以下のようあなたがProductCategoryためSTR方法を変更することができます

class ProductCategory(MPTTModel): 
    name = models.CharField(max_length=100) 
    parent = TreeForeignKey('self', null=True, blank=True, related_name='children') 

    def __str__(self): 
     return self.name 

UPDATE 2
、I私はより良い解決策を見つけたら私の答えを更新します。

+0

こんにちは、多くのありがとうございます。上記の私の画像を投稿した更新をご覧ください。子供がいないカテゴリだけが(正しく)表示されていますが、ラベルに親を表示することは可能ですか? – Newfoundland

関連する問題