2017-10-16 77 views
1

我在這裏做錯了什麼?因爲我一直收到無法將關鍵字類別解析爲字段錯誤。類別w not不解決

扔在這條線

services = services.filter(categories__category__name=category) 

例外然而,通過代碼看,人們會看到,有通過ServiceCategoryServicePage具有的「類相關的名稱service_categories場和ServiceCategory之間的關係。所以我在想,不應該拋出無法解析字段的異常錯誤。任何幫助在這一點上將不勝感激。

def get_service_context(context): 
    context['all_categories'] = ServiceCategory.objects.all() 
    context['root_categories'] = ServiceCategory.objects.filter(
    parent=None, 
    ).prefetch_related(
    'children', 
    ).annotate(
    service_count=Count('servicepage'), 
    ) 
    return context 

class ServiceIndexPage(Page): 
    header_image = models.ForeignKey(
     'wagtailimages.Image', 
     null=True, 
     blank=True, 
     on_delete=models.SET_NULL, 
     related_name='+' 
    ) 
    heading = models.CharField(max_length=500, null=True, blank=True) 
    sub_heading = models.CharField(max_length=500, null=True, blank=True) 
    body = RichTextField(null=True, blank=True) 

    def get_context(self, request, category=None, *args, **kwargs): 
     context = super(ServiceIndexPage, self).get_context(request, *args, **kwargs) 

     services = self.get_children().live().order_by('-first_published_at') #.prefetch_related('categories', 'categories__category') 

     if category is None: 
      if request.GET.get('category'): 
       category = get_object_or_404(ServiceCategory, slug=request.GET.get('category')) 
     if category: 
      if not request.GET.get('category'): 
       category = get_object_or_404(ServiceCategory, slug=category) 
      services = services.filter(categories__category__name=category) 

     # Pagination 
     page = request.GET.get('page') 
     page_size = 10 
     if hasattr(settings, 'SERVICE_PAGINATION_PER_PAGE'): 
     page_size = settings.SERVICE_PAGINATION_PER_PAGE 

     if page_size is not None: 
      paginator = Paginator(services, page_size) # Show 10 services per page 
      try: 
       services = paginator.page(page) 
      except PageNotAnInteger: 
       services = paginator.page(1) 
      except EmptyPage: 
       services = paginator.page(paginator.num_pages) 


     context['services'] = services 
     context['category'] = category 
     context = get_service_context(context) 

     return context 


@register_snippet 
class ServiceCategory(models.Model): 
    name = models.CharField(max_length=250, unique=True, verbose_name=_('Category Name')) 
    slug = models.SlugField(unique=True, max_length=250) 
    parent = models.ForeignKey('self', blank=True, null=True, related_name="children") 
    date = models.DateField(auto_now_add=True, auto_now=False, null=True, blank=True) 
    description = RichTextField(blank=True) 

    class Meta: 
     ordering = ['-date'] 
     verbose_name = _("Service Category") 
     verbose_name_plural = _("Service 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: 
      slug = slugify(self.name) 
      count = ServiceCategory.objects.filter(slug=slug).count() 
      if count > 0: 
       slug = '{}-{}'.format(slug, count) 
      self.slug = slug 
     return super(ServiceCategory, self).save(*args, **kwargs) 

class ServiceCategoryServicePage(models.Model): 
    category = models.ForeignKey(ServiceCategory, related_name="+", verbose_name=_('Category')) 
    page = ParentalKey('ServicePage', related_name='categories') 
    panels = [ 
     FieldPanel('category'), 
    ] 



class ServicePage(Page): 
    header_image = models.ForeignKey(
     'wagtailimages.Image', 
     null=True, 
     blank=True, 
     on_delete=models.SET_NULL, 
     related_name='+', 
     verbose_name=_('Header image') 
    ) 
    service_title = models.CharField(max_length=300, null=True, blank=True) 
    body = StreamField([ 
     ('h1', CharBlock(icon="title", classanme="title")), 
     ('h2', CharBlock(icon="title", classanme="title")), 
     ('h3', CharBlock(icon="title", classanme="title")), 
     ('h4', CharBlock(icon="title", classanme="title")), 
     ('h5', CharBlock(icon="title", classanme="title")), 
     ('h6', CharBlock(icon="title", classanme="title")), 
     ('paragraph', RichTextBlock(icon="pilcrow")), 
     ('aligned_image', ImageBlock(label="Aligned image", icon="image")), 
     ('pullquote', PullQuoteBlock()), 
     ('raw_html', RawHTMLBlock(label='Raw HTML', icon="code")), 
     ('embed', EmbedBlock(icon="code")), 
    ]) 
    date = models.DateField("Post date") 
    service_categories = models.ManyToManyField(ServiceCategory, through=ServiceCategoryServicePage, blank=True) 

    feed_image = models.ForeignKey(
     'wagtailimages.Image', 
     null=True, 
     blank=True, 
     on_delete=models.SET_NULL, 
     related_name='+', 
     verbose_name=_('Feed image') 
    ) 

    search_fields = Page.search_fields + [ 
     index.SearchField('body'), 
     index.SearchField('service_title'), 
     index.SearchField('title'),] 


    def get_absolute_url(self): 
     return self.url 


    def get_service_index(self): 
     # Find closest ancestor which is a service index 
     return self.get_ancestors().type(ServiceIndexPage).last() 


    def get_context(self, request, *args, **kwargs): 
     context = super(ServicePage, self).get_context(request, *args, **kwargs) 
     context['services'] = self.get_service_index().serviceindexpage 
     context = get_service_context(context) 
     return context 

    class Meta: 
     verbose_name = _('Service page') 
     verbose_name_plural = _('Services pages') 

    parent_page_types = ['services.ServiceIndexPage'] 


ServicePage.content_panels = [ 
    FieldPanel('title', classname="full title"), 
    FieldPanel('service_title'), 
    ImageChooserPanel('header_image'), 
    FieldPanel('date'), 
    InlinePanel('categories', label=_("Categories")), 
    StreamFieldPanel('body'), 
    ImageChooserPanel('feed_image'), 
] 

回答

1

當你上線叫self.get_children()

services = self.get_children().live().order_by('-first_published_at') 

結果是Page對象的查詢集只包含基本字段如title通用於所有的頁類型 - 因此,有沒有辦法過濾這個基於categories的查詢集。發生這種情況是因爲W has沒有辦法知道ServiceIndexPage的子頁面全部是ServicePages - 有關更完整的說明,請參見https://stackoverflow.com/a/46530443/1853523

但是,你可以按照如下改寫這一行:

services = ServicePage.objects.child_of(self).live().order_by('-first_published_at') 

我們可以肯定的是,查詢集ServicePage.objects.child_of(self)將只包含ServicePage對象,所以在categories過濾現在應該工作。