2015-11-11 9 views
6

faccio fatica a implementare qualcosa di simile a "categorie nidificate":categorie nidificate/InlinePanel (s) in cutrettola

PageA: 
    - Cat1 
    - SubCat1 
    - SubCat2 
    - ... 
    - Cat2 
    - SubCat1 
    - ... 

Tutte le categorie e sottocategorie devono essere ordinabili e modificabili da un editore.

La mia ipotesi era qualcosa di simile:

class CategoryTestPage(Page): 
    content_panels = Page.content_panels + [ 
     InlinePanel('categories') 
    ] 


class Category(Orderable,ClusterableModel,models.Model): 
    page = ParentalKey(CategoryTestPage, related_name='category') 
    category = models.CharField(max_length=250) 

    def __str__(self): 
     return "%d %s" % (self.id, self.category) 

    panels = [ 
      FieldPanel('category'), 
      InlinePanel('subcategory') 
    ] 

class SubCategory(Orderable,models.Model): 
    category = ParentalKey(ProjektOrdnung, related_name='subcategory') 
    subcategory = models.CharField(max_length=250) 

    def __str__(self): 
     return "%d %s" % (self.id, self.subcategory) 

    panels = [ 
      FieldPanel('subcategory') 
    ] 

Ma questo si traduce in 'CategoryForm' object has no attribute 'formsets'. Sembra nested InlinePanel s sono il problema?

Inoltre ho bisogno di questo "tassonomia gerarchica" assegnare per alcune di queste categorie/sottocategorie ad altre pagine della:

PageB: 
    - has Cat1 
     - has SubCa2 
    - ... 

... che assomiglia molto a tag gerarchici ...

Tutte le idee come implementare questo o cosa non va nella mia implementazione?

Cordiali saluti, tombreit

PS: Sono su ballerina 1.2rc1

risposta

3

Ecco un modo per farlo, con molto spazio per miglioramenti dell'interfaccia;) Al fine di risolvere le categorie a pagina livello, suggerirei l'uso di django-sortedm2m.

from wagtail.wagtailcore.models import Orderable, Page 
from wagtail.wagtailsnippets.models import register_snippet 
from django.db import models 


@register_snippet 
class Category(models.Model): 
    name = models.CharField(
     max_length=80, unique=True, verbose_name=_('Category Name')) 
    slug = models.SlugField(unique=True, max_length=80) 
    parent = models.ForeignKey(
     'self', blank=True, null=True, related_name="children", 
     help_text=_(
      'Categories, unlike tags, can have a hierarchy. You might have a ' 
      'Jazz category, and under that have children categories for Bebop' 
      ' and Big Band. Totally optional.') 
    ) 
    description = models.CharField(max_length=500, blank=True) 

    class Meta: 
     ordering = ['name'] 
     verbose_name = _("Category") 
     verbose_name_plural = _("Categories") 

    panels = [ 
     FieldPanel('name'), 
     FieldPanel('parent'), 
     FieldPanel('description'), 
    ] 

    def __str__(self): 
     return self.name 

    def clean(self): 
     if self.parent: 
      parent = self.parent 
      if self.parent == self: 
       raise ValidationError('Parent category cannot be self.') 
      if parent.parent and parent.parent == self: 
       raise ValidationError('Cannot have circular Parents.') 

    def save(self, *args, **kwargs): 
     if not self.slug: 
      self.slug = slugify(self.name) 
     return super(Category, self).save(*args, **kwargs) 


class CategoryPage(models.Model): 
    category = ParentalKey('Category', related_name="+", verbose_name=_('Category')) 
    page = ParentalKey('MyPage', related_name='+') 
    panels = [ 
     FieldPanel('category'), 
    ] 


class MyPage(Page): 
    categories = models.ManyToManyField(Category, through=CategoryPage, blank=True) 
    content_panels = Page.content_panels + [ 
     FieldPanel('categories'), 
    ] 
+0

Ma penso che questo richieda che lo snippet venga creato per primo. C'è un modo per fare la creazione della categoria anche in linea? – JhovaniC

+1

L'ho provato in questo modo, ma come notato da @ianprice, la parte dell'interfaccia lascia molto a desiderare. C'è un repository da torchbox (https://github.com/torchbox/wagtail-categories), ma sfortunatamente senza alcun progresso. Un altro approccio potrebbe essere http://wagtailplus.readthedocs.io/en/latest/relationships/ (non ancora provato). – tombreit

+0

Sembra esserci un approccio per categorie incoraggiato dagli autori di updot upstream sulla strada: https://github.com/wagtail/wagtail/pull/3305, dovrebbe essere disponibile per wagtail> = 1.9. – tombreit