2017-11-14 1 views
0

Problem: Dash-Zeichen in der Spalte "Übergeordnete Kategorie" angezeigt, bevor ich einen Menüeintrag öffnen. Ich erhalte ‚Übergeordnete Kategorie‘ Elemente, wenn sie geöffnet Menüpunkt Profil (siehe admin.py unten)Django: Übergeordnete Kategorien werden in der Benutzeroberfläche nicht angezeigt

Vor und nach dem Öffnen der Menü-Profil: picture1 und picture2 (achten Sie auf den Spaltenübergeordnete Kategorie)

Mein models.py: (Aufmerksamkeit auf 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) 

Mein 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) 

Frage: Wie konnte ich meine admin.py umschreiben parent_id Elemente anzuzeigen, ohne einen Menüpunkt Profil zu öffnen?

Ich habe bereits versucht Model.get_FOO_display(), aber es funktioniert nicht in der richtigen Weise. Jede Hilfe wäre willkommen.

Antwort

1

Ohne Ihr Modell zu ändern, ist die einfachste Lösung ist wahrscheinlich eine parent Methode in Ihrem Admin hinzuzufügen und verwenden Sie es anstelle von „parent_id“ in der list_display Liste:

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) 

Oder parent eine Methode oder Eigenschaft zu machen auf Ihrem Menu Modell:

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) 

und "Eltern" zu Ihrem admin list_display hinzuzufügen.

aber da Menu.parent_id ist eigentlich ein Fremdschlüssel auf Menu, ist die richtige Lösung, die es als solche in Ihrem Modell zu erklären:

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

Großen. Funktioniert wie ich es erwartet habe. Vielen Dank! –

Verwandte Themen