2011-10-06 5 views
8

나는 카테고리로 정리 된 몇 가지 정보를 가지고 있습니다. 각 카테고리에 대해 나는 우승자 foo를 선택할 수 있기를 원합니다.Django - 인스턴스에 따라 무언가를 선택할 수 있습니다.

는 따라서 I는 다음과 같이 모델을 가지고 :

class Category(models.Model): 
    name = models.CharField(max_length=30) 
    # More fields... 
    winner = models.ManyToManyField(
     'Foo', 
     related_name='winner' 
    ) 

class Foo(models.Model): 
    name = models.CharField(max_length=30) 
    # More fields... 
    category = models.ForeignKey(
     Category, 
     related_name='category' 
    ) 

(winnerManyToManyField 이유는 하나의 범주에 하나 이상이 될 수 있지만 하나의 푸 여러 범주에 속할 수 있다는 것입니다 우승자는 ex-aequo 때문에 생긴다.)

foo가 해당 카테고리에 속한 경우에만 카테고리에서 이길 수있는 자연스러운 제약 조건을 부과하고 싶다. 그렇게하는 가장 합리적인 방법은 limit_choices_to 매개 변수를 사용하는 것 같지만 모델의 현재 인스턴스를 기반으로 선택을 제한 할 수 없다고 생각됩니다.

나는 주어진 양식이 제약을 부과 할 수 있지만 나는 두 가지 이유 때문에이를 방지하고자 :

  • 제약 자연스럽게 모델 수준에서 살고있다. 그것은 특정 항상 두 개의 관련 모델
  • 승자의 선택은 관리자에 될 것이다, 내가 관리자를 사용자 정의하는 것을 피하기 싶습니다 사이에 보유해야 관계

인가 형성 거기 장고에이 제약 조건을 부과하는 방법은 무엇입니까?

답변

4

모델 수준에서 제약 조건을 (예 : limit_choices_to를 사용하여) 입력 할 수있는 방법이 없습니다. 그러나 다음 형식으로이 작업을 수행 할 수 있습니다.

class MyForm(forms.ModelForm): 
    class Meta: 
     model = models.Category 

    def __init__(self, *args, **kwargs): 
     super(MyForm, self).__init__(*args, **kwargs) 
     if 'instance' in kwargs: 
      my_category = kwargs['instance'] 
      self.fields['winner'].queryset = my_category.category.all() 

글쎄, 알았 니?

my_category.category.all() 

은 아마 당신이 원하는 것은 :

class Foo(models.Model): 
    name = models.CharField(max_length=30) 
    # More fields... 
    category = models.ForeignKey(
     Category, 
     related_name='participants' 
    ) 
관련 문제