LazerFriends
LazerFriends

Reputation: 421

AttributeError: 'DeferredAttribute' object has no attribute 'rel'

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

Answers (2)

gasman
gasman

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

gasman
gasman

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

Related Questions