2013-06-24 2 views
1

У меня есть модель профиля пользователя. Мне нужен новый метод дает мне оценку того, как заполнен профиль. Например:Профиль Django показывает процент завершен

Name 10% 
Mobile 50% 
Gender 10% 
Website 10% 
Location 10% 
birth_date 10% 

Значение, если пользователь заполнил имени и мобильного их профиля будет 60% завершены.

Может ли кто-нибудь заставить меня начать с того, как бы я совершил такое? спасибо:

Моя модель:

class Profile(UserenaLanguageBaseProfile): 
    """ Default profile """ 
    GENDER_CHOICES = (
     (1, _('Male')), 
     (2, _('Female')), 
    ) 

    user = models.OneToOneField(User, 
           unique=True, 
           verbose_name=_('user'), 
           related_name='profile') 

    gender = models.PositiveSmallIntegerField(_('gender'), 
               choices=GENDER_CHOICES, 
               blank=True, 
               null=True) 
    mobile = models.CharField(max_length=32, blank=True) 
    website = models.URLField(_('website'), blank=True,) 
    location = models.CharField(_('location'), max_length=255, blank=True) 
    birth_date = models.DateField(_('birth date'), blank=True, null=True) 

ответ

5

Один из подходов может быть:

class Profile(UserenaLanguageBaseProfile): 
    #attributes 

    @property 
    def percentage_complete(self): 
     percent = { 'name': 10, 'mobile': 50, 'website': 10, 'location': 10, 'birth_date': 10, 'gender': 10} 
     total = 0 
     if self.gender: 
      total += percent.get('gender', 0) 
     if self.name: 
      total += percent.get('name', 0) 
     #and so on 
     return "%s"%(total) 

, а затем profile.percentage_complete дает вам полноту. Поскольку вы управляете словарем, у вас есть полный контроль над весами, и значение гарантируется как процент.

+0

бы вы сделать это в @property? – GrantU

+1

хорошо .. не необходимо, но конечно. Планируете ли вы что-нибудь сделать с этим? – karthikr

+0

Могут быть времена, когда мне нужно перезаписать некоторые значения или сделать специальные вещи с помощью да. – GrantU

0

Работа над одним проектом, где мне нужно рассчитать полноту модели на нескольких моделях, вот мой вопрос, как я подошел к проблеме с использованием сигналов django. Мы могли бы воспользоваться этим примером, указав модели в настройках django.py. Как и отношения модели.

class UserProfile(UserenaLanguageBaseProfile): 
    complete_progress = { 'name': 10, 'mobile': 50, 'website': 10, 'location': 10, 'birth_date': 10, 'gender': 10} 


# If this is too heavy best put this in a background task celery 
@receiver(post_save) 
def model_completeness_listener(sender, instance=None, created=False, **kwargs): 
    list_of_models = [UserProfile, CustomerProfile] 
    if sender in list_of_models: 
     complete_progress = 0.0 
     total_weight = 0.0 
     for field in instance.completeness: 
     try: 
      total_weight += instance.completeness[field] 
       if getattr(instance, field): 
        complete_progress += instance.completeness[field] 
     except AttributeError: 
      continue 

     overall_completeness = (complete_progress/total_weight) * 100 
     print "------------%s---------------" % (sender.__name__) 
     print "[progress weight : %d total weight : %d overall completeness : %d]" % (complete_progress, total_weight, overall_completeness) 
     print "-----------------------------" 

ли что-то с overall_completeness процентов стоимости либо назначить его на модели профиля или сохранить его где-нибудь еще