1

我有两个不同的页面模型(没有子类化,单独的应用程序,只有相似的字段是常见的字段,如“模型名称”、“id”、“零件”),比如说汽车和摩托车。我正在制作一个单独的页面,其中包含它们的部件表(它还需要包含像“id”这样的列,我假设它可以是一个 pk,“网上商店链接”和“使用者”,它将显示所有自行车和汽车使用该零件的模型);由于它们可以共享一些相同的部分,我希望它们连接到相同的标签模型(而不是具有“CarPageTag”和“BikePageTag”);到目前为止我已经尝试过:

  • 我试图为“零件”制作一个单独的应用程序。我想出了如何从其他应用程序中包含该类,它适用于汽车或摩托车,但不能同时适用于两者,因为这个错误:

AssertionError: ParentalKey(['CarsBlogApp.CarDetailPage', 'BikesBlogApp.BikeDetailPage']) 无效。ForeignKey 的第一个参数必须是模型、模型名称或字符串“self”

  • 我有一个简单的解决方案,通过 ManyToManyField 在普通的 Django 应用程序中工作(但我需要管理员中的 wagtail 自动填充标签选择页面)
  • 我查看了 django、wagtail 和 taggit 文档
  • 我浏览了所有 youtube 教程

编辑:以我认为可行的方式添加 models.py :

PartsApp/models.py:

from django.db import models
from wagtail.core.models import Page
from wagtail.admin.edit_handlers import FieldPanel
from modelcluster.fields import ParentalKey
from taggit.models import TaggedItemBase

class PartsPage(Page):

    templates = "parts/parts_page.html"
    subpage_types = []
    max_count = 1
    parent_page_type = ['home.HomePage']
    paragraph = models.CharField(
        max_length=100,
        blank=False,
        null=False,
        help_text='Overwrites the default title',
    )

    content_panels = Page.content_panels + [
        FieldPanel("paragraph"),
    ]

    class Meta:
        verbose_name = "Needed supplies Page"
        verbose_name_plural = "Needed supplies Pages"

class PartTagPage(TaggedItemBase):
    content_object = ParentalKey(
        ['CarApp.CarDetailPage','BikeApp.BikeDetailPage'],
        related_name='tagged_items',
        on_delete=models.CASCADE,
    )

CarsApp/models.py

from django.db import models
from wagtail.admin.edit_handlers import FieldPanel, StreamFieldPanel
from wagtail.core.fields import StreamField
from wagtail.core.models import Page
from wagtail.images.edit_handlers import ImageChooserPanel
from blocks import blocks
from modelcluster.fields import ParentalKey
from modelcluster.contrib.taggit import ClusterTaggableManager
from taggit.models import TaggedItemBase
from PartsApp.models import PartTagPage

class CarListingPage(Page):
    template = "CarsApp/car_listing_page.html"
    subpage_types = ['CarsApp.CarDetailPage']
    parent_page_type = ['home.HomePage']
    max_count = 1
    paragraph = models.CharField(
        max_length=100,
        blank=False,
        null=False,
        help_text='Overwrites the default title',
    )

    content_panels = Page.content_panels + [
        FieldPanel("paragraph"),
    ]

    def get_context(self, request, *args, **kwargs):
        context = super().get_context(request, *args, **kwargs)
        all_cars = CarsDetailPage.objects.live().public().order_by('-first_published_at')

        if request.GET.get('tag', None):
            tags = request.GET.get('tag')
            all_cars = all_cars.filter(tags__slug__in=[tags])

        context["cars"] = all_animals
        return context

class CarDetailPage(Page):
    subpage_types = []
    parent_page_types = ['CarsApp.CarsListingPage']
    tags = ClusterTaggableManager(through='PartsApp.PartTagPage', blank=True)
    name = models.CharField(
        max_length=100,
        blank=False,
        null=False,
    )
    model = models.CharField(
        max_length=100,
        blank=False,
        null=False,
    )
    car_image = models.ForeignKey(
        "wagtailimages.Image",
        blank=False,
        null=True,
        related_name="+",
        on_delete=models.SET_NULL,
    )
    description = models.TextField(max_length=10000)

    content_panels = Page.content_panels + [
        FieldPanel("model"),
        FieldPanel("name"),
        FieldPanel("description"),
        FieldPanel("tags"),
        ImageChooserPanel("car_image"),
    ]

BikesApp /models.py 几乎相同。 同样,这些不起作用。

4

1 回答 1

4

设置单独的CarPageTagBikePageTag模型您想要的解决方案(假设它们是 的子类TaggedItemBase根据 Wagtail 文档中显示的模式)。

TaggedItemBase它本身不是一个标签模型——它只是定义了页面模型和标签模型之间的关系(在这种情况下,它是taggit.Tagdjango-taggit 库默认提供的标准标签模型)。因此,和CarPageTag之间建立关系, 和CarPage之间建立关系- 两者都使用相同的标签模型。taggit.TagBikePageTagBikePagetaggit.Tag

如果您确实希望汽车和自行车维护自己的独立标签集,则需要不同的模式 -自定义标签模型

于 2020-05-10T22:50:22.840 回答