3

In my model I have a class

class User(AbstractDateTime, AbstractBaseUser, PermissionsMixin, models.Model):

    email = models.EmailField(max_length=255, unique=True,blank=False,default='')
    first_name = models.CharField(max_length=255, blank=False,default='')
    last_name = models.CharField(max_length=255, blank=False,default='')
    merchant_id = models.CharField(max_length=255, blank=True,default='')
    customer_id = models.CharField(max_length=255, blank=True,default='')
    phone_number = models.CharField(max_length=255,blank=False,default='')
    zip_code = models.CharField(max_length=10,blank=False,default='')
    photo = models.FileField(upload_to='images/users', default=None, blank=True, null=True)
    STATUS_TYPES = (('admin', 'admin'),('client', 'client'))
    role = models.CharField(max_length=10,choices=STATUS_TYPES,default='client')
    reset_key = models.CharField(max_length=255, blank=True,default='')
    credits = models.DecimalField(max_digits=5, decimal_places=2,default=0)
    is_staff = models.BooleanField(default=0)
    is_active = models.BooleanField(default=1)
    objects = AuthUserManager()
    USERNAME_FIELD = 'email'


    def last_seen(self):
        return cache.get('seen_%s' % self.user.email)

    def online(self):
        if self.last_seen():
            now = datetime.datetime.now()
            if now > self.last_seen() + datetime.timedelta(
                         seconds=settings.USER_ONLINE_TIMEOUT):
                return False
            else:
                return True
        else:
            return False

    def get_full_name(self):
        full_name = '%s %s' % (self.first_name, self.last_name)
        return full_name.strip()

    def get_short_name(self):
        return self.first_name

    def __unicode__(self):
        return unicode(self.email) or 'not found'



    class Meta:
        ordering = ["id"]
        db_table = "user"
        get_latest_by = "created"

when in view i tring to call online method of my model

users = User.objects.filter()
for user in users:
    user.online()

i get this error 'User' object has no attribute 'user'

Shang Wang
  • 24,909
  • 20
  • 73
  • 94
Sipan
  • 103
  • 2
  • 8

1 Answers1

8

Your function last_seen has a bug. You were doing self.user.email which is incorrect, it should be self.email.

Also, it's not good practice to do User.objects.filter(), because filter is used for doing lookup with conditions like sql WHERE. If you want all results, do User.objects.all().

Shang Wang
  • 24,909
  • 20
  • 73
  • 94
  • Thanks for your answer. Can you advise how can i call my online method from template. – Sipan Jun 02 '16 at 06:45
  • It's the same way you call `online()` in the views, but without `()`, so it's just `{% for user in users %} {{ user.online }} {% endfor %}`. – Shang Wang Jun 02 '16 at 12:56