2017-11-14 26 views
0

問題: メニュー項目を開く前にダッシュ記号が「親カテゴリ」列に表示されます。マイmodels.pyDjango:親カテゴリは管理インターフェースに表示されません

(親カテゴリの列に注意を払う)picture1picture2:とき開いてメニュー項目プロファイルIは、メニュープロファイルの開口部の前と後の

(以下admin.pyを参照)「親カテゴリ」項目を取得parent_id上の注意)

class Menu(models.Model): 

    cat_title = models.CharField(max_length=150, verbose_name='Category title') 
    menu_title = models.CharField(max_length=150, verbose_name='Menu title') 
    parent_id = models.IntegerField(blank=True, null=True, verbose_name='Parent category', choices=(('',''),)) 
    url = models.CharField(max_length=255, verbose_name='URL', blank=True) 
    named_url = models.CharField(max_length=255, verbose_name='Named URL', blank=True) 
    level = models.IntegerField(default=0, editable=False) 

マイadmin.py()

class MyMenu(admin.ModelAdmin): 

    def get_choices(self): 
     choices = (('',''),) 
     categories = models.Menu.objects.all().values() 
     for i in categories: 
      choices += ((i['id'], i['cat_title']),) 
     return choices 

    def formfield_for_choice_field(self, db_field, request): 
     if db_field.name == 'parent_id': 
      db_field.choices = self.get_choices() 

     return super().formfield_for_choice_field(db_field, request) 
    list_display = ('cat_title', 'menu_title', 'parent_id', 'level') 
    list_display_links = ('cat_title', 'menu_title') 

    admin.site.register(models.Menu, MyMenu) 

質問:どのように私はすべてのメニュー項目のプロファイルを開くことなくparent_idの項目を表示するために、私のadmin.pyを書き換えることができますか?

私は既にModel.get_FOO_display()を試しましたが、正しい方法では動作しません。どんな助けもありがとう。

答えて

1

モデルを変更せずに、最も簡単な解決策は、あなたの管理者にparentメソッドを追加し、list_displayリストで「PARENT_ID」の代わりに使用することはおそらくです:

class MyMenu(admin.ModelAdmin): 
    # .... 
    def parent(self, obj): 
     if obj.parent_id: 
      return Menu.objects.get(pk=obj.parent_id).cat_title 
     return "" 

    list_display = ('cat_title', 'menu_title', 'parent', 'level') 


    # Unrelated but you may also want to rewrite `get_choices` 
    # in a simpler and more performant way: 
    def get_choices(self): 
     choices = models.Menu.objects.values_list("id", "cat_title")) 
     return (('',''),) + tuple(choices) 

それともparentメソッドやプロパティを作成しますあなたのMenuモデル上:

class Menu(models.Model): 
    # ... 

    # you may want to use django's `cached_property` instead 
    # but then you'll have to invalidate the cache when setting 
    # (or unsetting) `.parent_id` 
    @property 
    def parent(self): 
     if not self.parent_id: 
      return None 
     return Menu.objects.get(pk=self.parent_id) 

とあなたの管理者のlist_displayに "親" を追加します。

しかしMenu.parent_idが実際にMenuの外部キーであることから、適切な解決策は、あなたのモデルにそのように宣言することです:

class Menu(models.Model): 
    cat_title = models.CharField(max_length=150, verbose_name='Category title') 
    menu_title = models.CharField(max_length=150, verbose_name='Menu title') 
    parent = models.ForeignKey("self", blank=True, null=True, related_name="children") 
    # etc 
+0

グレート。期待どおりに動作します。ありがとう! –

関連する問題