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

일부 값을 덮어 쓰거나 yes로 특별한 작업을해야 할 때가 있습니다. – GrantU

0

두 개의 모델에서 모델 완성도를 계산해야하는 프로젝트 하나에서 작업하는 것이 내 장고 신호를 사용하여 문제에 접근 한 방법입니다. 우리는 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 값 (%)이 프로파일 모델에 할당하거나 다른 곳

관련 문제