我有一个具有HomePage
模型的home应用,该应用从blog应用中的BlogPage
模型获取对象。我使用下面的代码从BlogPage
到HomePage
获取对象。
博客应用
class HomePage(Page):
primary_header = models.CharField(max_length=100, blank=True,)
secondary_header = models.CharField(max_length=100, blank=True,)
hero_banner_image = models.ForeignKey(
'wagtailimages.Image',
null=True,
blank=False,
on_delete=models.SET_NULL,
related_name='+')
def get_context(self, request, *args, **kwargs):
context = super().get_context(request, *args, **kwargs)
# Get object from Blog Page
blogpages = self.get_children().get(title='Blog Page').get_children().live().public().order_by('-first_published_at')
context['blogpages'] = blogpages
return context
我使用get()
按标题获取对象,但我认为这可能不是最好的方法。如果我将BlogPage
标题字段重命名为例如“博客页面”,由于不再使用“博客页面”,它将破坏代码。从BlogPage
到HomePage
模型是否有更好的查询集方法?
家庭应用
class BlogPage(Page):
subpage_types = ['PostPage']
def get_context(self, request, *args, **kwargs):
context = super().get_context(request, *args, **kwargs)
category_slug = request.GET.get('category', None)
context['categories'] = BlogCategory.objects.all()
return context
如果您知道您的HomePage
只会有一个BlogPage
类型的孩子,则可以使用WagtailPageQuerySet
exact_type
查询。
blog_index_page = self.get_children().exact_type(BlogPage).first()
blog_pages = blog_index_page.get_children().live().public().order_by('-first_published_at')
first
-https://docs.djangoproject.com/en/3.0/ref/models/querysets/#first如果从其他应用程序导入模型时遇到问题,则可以使用apps.get_model
的一部分django.apps
解决此问题。
注意:您可能需要在get_context
中进行此导入,以避免循环导入问题。
from django.apps import apps
MyModel1 = apps.get_model('app1', 'MyModel1')