Reputation: 421
I'm new to Wagtail and Django, and I am trying to build a model that will pull data from a REST API and put it into an object that can be iterated on the template. However, when trying to migrate, I get this error:
related = getattr(model, self.relation_name).rel
AttributeError: 'DeferredAttribute' object has no attribute 'rel'
From what I've been able to gather so far, it has something to with the description
and image
fields in the OFSLOrgWebPage
page model. Here are the relevant models:
from __future__ import absolute_import, unicode_literals
from django.db import models
from django.shortcuts import render
from django.conf import settings
from wagtail.wagtailcore.models import Page, Orderable
from wagtail.wagtailcore.fields import RichTextField, StreamField
from wagtail.wagtailadmin.edit_handlers import FieldPanel, FieldRowPanel, MultiFieldPanel, \
InlinePanel, StreamFieldPanel
from wagtail.wagtailimages.edit_handlers import ImageChooserPanel
from wagtail.wagtailsearch import index
from wagtail.wagtailcore.blocks import StructBlock, StreamBlock, CharBlock, RichTextBlock, RawHTMLBlock, BooleanBlock
from wagtail.wagtailimages.blocks import ImageChooserBlock
from wagtail.wagtaildocs.blocks import DocumentChooserBlock
from modelcluster.fields import ParentalKey
import datetime
import json
import requests
class OFSLOrgWebPage(Page):
description = RichTextField(blank=True)
image = models.ForeignKey(
'serenity.Images',
null=True,
blank=True,
on_delete=models.SET_NULL,
related_name='+',
help_text="Council image that appears at the top of the page. Size: 500px x 400px"
)
def get_context(self, request):
context = super(OFSLOrgWebPage, self).get_context(request)
context['greek_orgs'] = self.greek_bios.objects.child_of(self).live()
return context
search_fields = Page.search_fields + [
index.SearchField('description'),
index.SearchField('greek_orgs'),
]
content_panels = Page.content_panels + [
InlinePanel('description', label='Council Description'),
InlinePanel('image', label='Council Image'),
InlinePanel('greek_bios'),
]
template = '../templates/ofsl_site/ofsl_org_web_page.html'
class Meta:
verbose_name = "OFSL Greek Org Page"
class OFSLGreekBio(Orderable):
name = models.CharField(max_length=255, blank=True)
letters = models.CharField(blank=True, max_length=3)
group_id = models.CharField(max_length=255, blank=True)
page = ParentalKey(OFSLOrgWebPage, related_name='greek_bios')
def get_groups(self):
response = requests.get(
('{}/api/v1/groups-search/?legacy_group_id={}?format=json').format(
settings['API_BASE_URL'],
int(self.group_id)))
if response.status_code != 200:
return ''
return response.json()['objects']
panels = [
FieldPanel('name'),
FieldPanel('letters'),
FieldPanel('group_id'),
]
class Meta:
verbose_name = "Greek Organization"
verbose_name_plural = "Greek Organizations"
EDIT: I'm running Django 1.11.4 and Wagtail 1.13.1
Upvotes: 4
Views: 2750
Reputation: 25292
Your content_panels
definition is using the wrong panel type for description
and image
- InlinePanel
is only used for child object relations such as your greek_bios
. You probably want this instead:
content_panels = Page.content_panels + [
FieldPanel('description'),
ImageChooserPanel('image'),
InlinePanel('greek_bios'),
]
Upvotes: 7
Reputation: 25292
You are using Django 2.0 with a version of Wagtail that doesn't support it - the first version of Wagtail with Django 2.0 support will be Wagtail 2.0, which is currently in beta.
You need to either downgrade to Django 1.11.x, or install the Wagtail 2.0 beta release.
Upvotes: 0