2014-12-19 3 views
0

내 장고 응용 프로그램 fooapp을 사용하는 두 명의 고객이 있습니다.ModelChoiceFields의 공장

  • 1 고객은 ('이름', 'LAST_NAME', 'FIRST_NAME')
  • Customer2가 ('LAST_NAME', 'FIRST_NAME')
으로 분류로 사용자를위한 ChoiceFields을 원으로 분류로 사용자를위한 ChoiceFields을 원한다

고객 전용 코드를 fooapp에 넣고 싶지 않습니다.

고객이 좋아하는 방식으로 모든 UserChoiceField를 응용 프로그램에 표시하려면 어떻게합니까?

간단한 해결책은 USER_CHOICE_ORDER_BY과 같은 설정입니다. 그러나 조만간 더 어려운 일들이 필요할 것입니다. 그런 다음 가져 오기 문자열이있는 설정을 USER_CHOICE_FIELD에 사용할 수 있습니다.

뒤로 물러나서 새의 눈을 봅니다. 의 모든ModelChoiceFields을 사용자 지정한 필드에 보낼 수있어서 좋지 않겠습니까?

예 : 일반 솔루션은 사용자, 그룹, ... 모든 모델 (제 장고 제공 또는 제 3 자 제공)에서 작동해야합니다.

이미 이와 비슷한가요?

+0

이해가 안 무엇이야 [order_by] (https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.order_by) 사용에 문제가 있습니까? – DRC

+0

@DRC 피드백에 감사드립니다. 저는 질문을 업데이트했습니다 : 고객 특정 코드를 fooapp에 넣고 싶지 않습니다. 고객이 좋아하는 방식으로 모든 UserChoiceField를 응용 프로그램에 표시하려면 어떻게합니까? – guettli

+0

고객은 앱을 앱의 일부로 사용하는 Django 코드를 보유하고 있습니까? – RemcoGerlich

답변

0

@DRC에서 언급했듯이 영향을받을 모델에서는 order_by 메타 속성을 사용해야합니다.

:

MODEL_ORDER_BY = { 
    'User':['username', 'last_name', 'first_name'] 
} 

그런 다음 models.py 파일에이 방법으로이 값을 참조 할 수 있습니다 : 어떤 고객이 특정 코드는 다음처럼 settings.py 파일이 추가가없는 확인하십시오 django.conf 가져 오기 설정

Class User 
    class Meta(): 
     # Making sure we have a settings value for this model first 
     if self.__name__ in settings.MODEL_ORDER_BY: 
      # Setting the list that's paired with this name 
      order_by = settings.MODEL_ORDER_BY[self.__name__] 
0

에서 당신은 fooapp에 UserChoiceSortItem 모델을 추가 할 수 있으며이 모델의 객체가 다른 모델을 정렬 우선 순위를 개최 :

class UserChoiceSortItem(models.Model): 
    _models = [ 
     (0, 'Profiles'), 
     (1, 'Groups'), 
     . 
     . 
     . 
    ] 
    sort_field = models.CharField(max_length=200) 
    priority = models.IntegerField() 
    model = models.IntegerField(choices=_models) 
    _model_type = None   

    @property 
    def model_class(self): 
     if self._model_type is None: 
     from django.apps import apps 
     _models = ['fooapp.CustomProfile', 'django.contrib.auth.Group', ...] 
     self._model_type = apps.get_model(*_models[self.model].rsplit('.', 1)) 
     return self._model_type 

그리고 당신은보기 또는 형태로 UserChoiceSortItems 모델의 개체를 사용할 수 있습니다 :

. 
. 
. 
order_fields = [] 
for sort_item in UserChoiceSortItems.objects.all().order_by('priority'): 
    if isinstance(curent_model_objects, sort_items.model_class): 
     order_fields.append(sort_item) 
curent_model_objects.order_by(*order_fields) 
choice_field.choices = order_fields 
. 
. 
. 

또한 당신은 예컨대 기구 fooapp에서를 (사용하여 다른 고객에 대해 서로 다른 상태를 시작할 수 있습니다. 첫 번째 고객 fooapp/설비/customer1.json)에 대한 :

[ 
    { 
     'pk': 1, 
     'model': 'fooapp.UserChoiceSortItems', 
     'fields': { 
      'sort_field': 'username', 
      'priority': 0, 
      'model': 'fooapp.CustomProfile' 
     } 
    }, 
    { 
     'pk': 2, 
     'model': 'fooapp.UserChoiceSortItems', 
     'fields': { 
      'sort_field': 'first_name', 
      'priority': 1, 
      'value': 'fooapp.CustomProfile' 
     } 
    }, 
    { 
     'pk': 3, 
     'model': 'fooapp.UserChoiceSortItems', 
     'fields': { 
      'sort_field': 'last_name', 
      'priority': 2, 
      'model': 'fooapp.CustomProfile' 
     } 
    }, 
    . 
    . 
    . 
] 

와 두 번째 고객 fooapp/설비/customer2.json에 대한

:
[ 
    { 
     'pk': 1, 
     'model': 'fooapp.UserChoiceSortItems', 
     'fields': { 
      'sort_field': 'first_name', 
      'priority': 0, 
      'model': 'fooapp.CustomProfile' 
     } 
    }, 
    { 
     'pk': 2, 
     'model': 'fooapp.UserChoiceSortItems', 
     'fields': { 
      'sort_field': 'last_name', 
      'priority': 1, 
      'value': 'fooapp.CustomProfile' 
     } 
    }, 
    . 
    . 
    . 
] 

syncdb 후 아래의 명령으로 데이터를로드 할 수 있습니다.

1 고객 :

./manage.py loaddata customer1 

customer2 :

./manage.py loaddata customer2 

당신과 장고 - 관리자에 정렬 우선 순위를 편집하고 즐길 수있는 고객이 ...