2017-10-16 6 views
1

내가 뭘 잘못하고 있니? 계속해서 키워드 카테고리를 입력란 오류로 해결할 수 없습니다. 이 광고wagtail의 카테고리가 해결되지 않음

services = services.filter(categories__category__name=category) 

던져

예외 그러나 코드를 찾고, 하나의 카테고리 '에 관련된 이름을 가진 ServiceCategoryServicePage 통해 service_categories 필드와 ServiceCategory 관계가 있다고 볼 것이다. 그래서 나는 필드를 해결할 수 없다는 예외 오류를 던져서는 안된다고 생각했다. 이 시점에서 어떤 도움을 주시면 감사하겠습니다. 당신은 줄에 self.get_children() 전화

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

: 결과는 모든 페이지 유형에 공통되는 등 title 같은 기본 필드를 포함 Page 객체의 검색어가

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

- 결과적있다 categories을 기반으로이 쿼리 세트를 필터링 할 수 없습니다. 이것은 Wagtail이 ServiceIndexPage의 하위 페이지가 모두 ServicePages라는 것을 알 수있는 방법이 없기 때문에 발생합니다. 자세한 설명은 https://stackoverflow.com/a/46530443/1853523을 참조하십시오. 다음과 같이

그러나이 줄을 다시 작성할 수 있습니다 :

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

우리는 너무 categories 필터링하는 것은 이제 작동합니다의 검색어 세트 ServicePage.objects.child_of(self)ServicePage 개체를 포함 할 것이라는 점을 확실 할 수있다.