'用户'对象没有属性' allow_add_item'

时间:2017-06-07 10:12:36

标签: python-2.7 django-models django-1.8

我尝试使用以下配置文件模型扩展我的用户模型,但是我收到了属性错误

  

用户'对象没有属性' allow_add_item

我的应用模型有以下课程。请告诉我需要哪些更正。

class CustomUser(models.Model):
    user = models.OneToOneField(User, related_name="dcf_profile")
    phone = models.CharField(_('phone'), max_length=30, null=True, blank=True)
    receive_news = models.BooleanField(_('receive news'), default=True, db_index=True)
    def allow_add_item(self):
        if self.item_set.count() > settings.DCF_ITEM_PER_USER_LIMIT:
            return False
        else:
            return True

class Item(models.Model):
    slug = models.SlugField(blank=True, null=True, max_length=100)
    user = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
    group = models.ForeignKey(Group, verbose_name=_('group'))
    title = models.CharField(_('title'), max_length=100)
    description = models.TextField(_('description'))

    price = models.DecimalField(_('price'), max_digits=10, decimal_places=2)
    phone = models.CharField(_('phone'), max_length=30)
    is_active = models.BooleanField(_('display'), default=True, db_index=True)
    updated = models.DateTimeField(_('updated'), auto_now=True, db_index=True)
    posted = models.DateTimeField(_('posted'), auto_now_add=True)

    def __unicode__(self):
        return self.title
    class Meta:
        verbose_name = _('item')
        verbose_name_plural = _('items')
        ordering = ('-updated', )
    def get_absolute_url(self):
        return reverse('item', kwargs={
            'pk': self.pk,
            'slug': self.slug
        })
    def get_title(self):
        return u'%s' % self.title
    def get_description(self):
        return u'%s' % self.description[:155]
    def get_keywords(self):
        # TODO need more optimal keywords selection
        return ",".join(set(self.description.split()))
    def get_related(self):
        # TODO Need more complicated related select
        return Item.objects.exclude(pk=self.pk)[:settings.DCF_RELATED_LIMIT]
    def save(self, *args, **kwargs):
        if self.slug is None:
            self.slug = slugify(unidecode(self.title))
        super(Item, self).save(*args, **kwargs)

我的views.py包含:

@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
    if not self.request.user.allow_add_item():
        messages.error(self.request, _('You have reached the limit!'))
        return redirect(reverse('my'))

2 个答案:

答案 0 :(得分:0)

很难确定,因为您发布的代码除了您要询问的内容之外还有缩进错误。

但是您的消息表明您尚未定义要尝试呼叫的方法。如果您希望类CustomUser具有方法allow_add_item(),则方法定义必须位于类中。我看到的是一行代码,仅在此之后调用post_save.connect()allow_add_item()的定义。如果你这样做,它不是类的成员,它只是一个具有误导性参数self的函数,使它看起来像一个方法。

您需要缩进它以将其放在类定义中。并且中间没有无关的代码。

class CustomUser(models.Model):
    ...
    def allow_add_item(self):
        if self.item_set.count() > settings.DCF_ITEM_PER_USER_LIMIT:
            return False
        else:
            return True

答案 1 :(得分:0)

假设每个用户都附加了一个CustomUser,您需要更改的内容是self.request.user.allow_add_item()self.request.user.customuser.allow_add_item()

您的CustomUser不会替换常规用户,而是通过一对一的关系扩展它。

来源:https://docs.djangoproject.com/en/1.8/topics/auth/customizing/#extending-the-existing-user-model