2013-02-14 4 views
1

최근에는 Django 1.4.3 (Python 2.7)을 사용 해왔고 동적으로로드 할 수 있도록 모델 필드가 필요했습니다. 기본적으로 어딘가에서 가능한 선택 옵션을 등록 할 가능성이 필요했습니다. Django 모델의 동적 선택

먼저 나는 생각했다 :

을 Baah, 그것은 거 쉬울거야.

models.py

class CategoryModels: 
    def __init__(self): 
     self.category_models = [ 
      ['dummy', 'dummy'] 
     ] 

    def register(self, model, label=None): 
     if label == None: 
      label = model.split('.').pop() 
     self.category_models.append([model, label]) 

    def get_models(self): 
     return self.category_models 

category_models = CategoryModels() 

class Category(models.Model): 
    MODEL_CHOICES = category_models.get_models() 

    name = models.CharField(blank=False, unique=True, max_length=30) 
    model = models.CharField(blank=False, max_length=30, choices=MODEL_CHOICES) 

: 파이썬은 여기

나를 위해 일한 조각입니다 ... 그것은 그 잘 갔다하지 않습니다

참조 목록을 통과 admin.py

import app 
app.models.category_models.register('app.models.Entity') 
app.models.category_models.register('app.models.OtherModel') 

작동하지만 ... 목록에 일부 '더미'항목이 들어 있습니다. 이상한 부분은 '더미'항목이 없어도 작동하지 않습니다 (일반 입력 필드 만 얻음). 나는 이미이 주제에 대한 연구를했고 게으른 로딩 등으로 다른 솔루션을 찾았습니다. 하지만이 중 가장 쉬운 방법 인 것 같습니다. 난 왜 '더미'항목없이 작동하지 않는지 궁금해? 왜 선택은 공백입니까? 이 파이썬이나 장고 메커니즘을 함께 할 수있는 뭔가가 있나요

def get_models(self): 
     return self.category_models.reverse() 

: 그것은 또한 당신이 그런 짓을하면 나누기? 그런 행동에 대한 설명을 찾고 있습니다.

감사합니다. ForeignKey 필드를 사용

+0

"깨지다"는 것은 무엇을 의미합니까? 우리에게 완전한 파이썬 오류를주십시오. – rantanplan

+0

일반 입력 필드 만 있습니다. 선택 매개 변수가 비어있는 경우와 같습니다. –

+0

reverse()는 None을 반환하므로, reverse 예제에는 버그가 있습니다. "return reversed (self.category_models.reverse())" –

답변

0

당신이 저를 요구하는 경우에 갈 수있는 방법입니다

class CategoryModel(models.Model): 
    pass 


class Category(models.Model): 
    model = models.ForeignKey(CategoryModel) 
    pass 

당신은 관리자 패널에 CategoryModel를 추가하는 경우, 당신은 변덕에 CategoryModels를 추가/제거 할 수 있습니다.

범주 모델 양식에 ForeignKey가 있으면 SELECT 입력이 표시됩니다.

+0

그건 내가 이미 생각한 것 중 하나지만, 실제 데이터로 더미 항목을 바꿀 수 있으므로 저의 접근 방식이 저에게 효과적입니다. 너무 많은 것으로 보이기 때문에 이것을 데이터베이스에 보관할 필요가 없다고 생각합니다. 내가 말했듯이, 나는 이것의 이상한 행동에 대한 설명을 찾고있다. –