2013-06-24 109 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

可能有些時候我需要覆蓋一些數值,或者使用yes來做特殊的事情。 – GrantU

0

在一個項目上工作,我必須在這裏對幾個模型計算模型完整性,這是我使用django信號來解決問題的方法。我們可以通過在django settings.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百分比值,要麼把它分配給剖面模型或存儲它別的地方