2012-09-03 4 views
0

내가 그런 모델에 사용되는 평일를 저장하는 필드 (models.py) 생성 시각화 :장고 사용자 정의 필드는 저장하지만

from myfields import * 
from django.db import models 

class MyModel(models.Model): 
    weekdays = WeekdayField() 

난 형태의 선언을 저장 한있는 파일이 myfields.py입니다이며 이 하나

from django.db import models 
from django import forms 

class Weekdays(object): 
    CHOICES = (
     (1, "Monday"), 
     (2, "Tuesday"), 
     (4, "Wednesday"), 
     (8, "Thursday"), 
     (16, "Friday"), 
     (32, "Saturday"), 
     (64, "Sunday"), 
     ) 
    MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY = [2**i for i in range(0,7)] 
    del i 

    def __init__(self, value=0): 
     self.raw = value 

    def __add__(self, other): 
     return Weekdays(self.raw | other) 

    def __sub__(self, other): 
     return Weekdays(self.raw & (-1^other)) 

    def __unicode__(self): 
     ret = [] 
     for ele in Weekdays.CHOICES: 
      if (self.raw & ele[0]) >> ele[0] == 1: 
       ret.append(ele[1]) 
     return ",".join(ret) 

    def __iter__(self): 
     ret = [] 
     for ele in Weekdays.CHOICES: 
      if (self.raw & ele[0]) >> ele[0] == 1: 
       ret.append(ele) 
     return iter(ret) 

    def __len__(self): 
     i = 0 
     for n in range(7): 
      if (self.raw & n) >> n == 1: 
       i += 1 
     return i 



class WeekdayField(models.Field): 
    description = "Multiple select of weekdays" 

    __metaclass__ = models.SubfieldBase 

    def __init__(self, *args, **kwargs): 
     kwargs['max_length'] = 3 
     super(WeekdayField, self).__init__(*args, **kwargs) 

    def to_python(self, value): 
     if isinstance(value, int): 
      return [ wd for wd in Weekdays(value) ] 
     if isinstance(value, Weekdays): 
      return value 
     if isinstance(value, list): #list of weekstay 
      wd = Weekdays() 
      for val in value: 
       wd += int(val) 
      return wd 

    # PY to DB 
    def get_prep_value(self, value): 
     return value.raw 

    def formfield(self, **kwargs): 
     defaults = {'form_class': WeekdayFormField} 
     defaults.update(kwargs) 
     return super(WeekdayField, self).formfield(**defaults) 

    def get_internal_type(self): 
     return "IntegerField" 


class WeekdayFormField(forms.MultipleChoiceField): 
    def __init__(self, *args, **kwargs): 
     if 'choices' not in kwargs: 
      kwargs['choices'] = Weekdays.CHOICES 
     kwargs.pop('max_length', None) 
     if 'widget' not in kwargs: 
      kwargs['widget'] = forms.widgets.CheckboxSelectMultiple 
     super(WeekdayFormField, self).__init__(*args, **kwargs) 


    def clean(self, value): 
     super(WeekdayFormField, self).clean(value) 
     possible_values = [ str(x[0]) for x in Weekdays.CHOICES ] 
     for v in value: 
      if not v in possible_values: 
       raise forms.ValidationError("Day not valid") 
     return value 

내가 만들고 장고 관리를 통해 요소를 제거 할 수 있습니다이 사용,하지만 난 값을 수정할 때 나는 이전에 저장된 값이 표시되지 않습니다. 나는 데이터베이스에 보니 값이 바로 저장됩니다.

내가 장고 관리자의 현재 값이 수정하는 동안, 무엇을 볼 수 있도록하는 방법에 어떤 아이디어?

답변

0

나는 해결책을했습니다! 이 방법 Weekdays.__unicode__()Weekdays.__iter__()의 잘못된 구현했다.

마지막 또한 WeekdayField에서보고 아래 두 가지 방법을 변경했다.

#Class-type 
class Weekdays(object): 
    ... 

    def __unicode__(self): # Request for the matching 
     ret = [] 
     for i,ele in enumerate(Weekdays.CHOICES): 
      if (self.raw & ele[0]) >> i == 1: 
       ret.append(unicode(ele[0])) 
     return ','.join(ret) 

    def __iter__(self): 
     for i,ele in enumerate(Weekdays.CHOICES): 
      if (self.raw & ele[0]) >> i == 1: 
       yield Weekdays(ele[0]) 


#Field to include in the model 
class WeekdayField(models.Field): 
    ... 

    # DB to PY 
    def to_python(self, value): 
     if isinstance(value, int): 
      return [ wd for wd in Weekdays(value) ] 
     if isinstance(value, unicode): 
      return [ wd for wd in Weekdays(int(value)) ] 
     if isinstance(value, Weekdays): 
      return value 
     if isinstance(value, list): #list of Weekdays 
      wd = [] 
      for val in value: 
       wd += self.to_python(val) 
      return wd 

    #PY to DB 
    def get_prep_value(self, value): 
     if isinstance(value, Weekdays): 
      return value.raw 
     if isinstance(value, list): 
      sum_raw = 0 
      for val in value: 
       sum_raw += self.get_prep_value(val) 
      return sum_raw 

누군가에게 도움이되기를 바랍니다.

관련 문제