2012-02-18 2 views
1

자동 관리자를 사용하여 기본 장고 사이트를 설정하고 '+'버튼을 사용하여 외래 키 (식물)를 추가하여 성분. 그러나 식물은 주문을받지 않았으므로 아래 양식과 같이 양식 필드를 재정의해야했습니다.Django admin - admin 양식 필드를 무시할 때 외래 키 팝업 '+'이 누락되었습니다.

이렇게하면 팝업이 열리는 '+'버튼이 누락되었습니다.이 방법을 다시 포함시키는 간단한 방법이 있습니까? 아니면 외래 키 드롭 다운을 주문하는 것이 더 좋은 방법입니까? 감사.

class IngredientAdminForm(forms.ModelForm): 
    plant = forms.ModelChoiceField(queryset=Plant.objects.order_by('name'), required=False) 

    class Meta: 
     model = Ingredient 


class IngredientAdmin(admin.ModelAdmin): 
    list_display = ('name', 'description', 'plant') 
    form = IngredientAdminForm 

답변

1

먼저 모델에 default ordering을 설정 했습니까? 관리자보다 주문을 설정하는 것이 더 합리적 일 수 있습니다.

class Plant(models.Model): 
    name = models.CharField(max_length=30) 

    class Meta: 
     ordering = ['name',] 

양식에서 다른 순서를 원하면 쿼리 세트를 변경하는 것이 좋습니다. 양식에서 식물 필드를 명시 적으로 정의 할 필요가 없으므로 __init__ 방법으로 쿼리 세트를 변경할 수 있습니다.

class IngredientAdminForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(IngredientAdminForm, self).__init__(*args, **kwargs) 
     self.fields['plant'].queryset = Plant.objects.order_by('name') 

    class Meta: 
     model = Ingredient 

장고 관리에서는 실제로 사용자 정의 모델 양식을 정의 할 필요가 없습니다. 모델 관리 방법 formfield_for_foreignkey을 사용할 수 있습니다.

class IngredientAdmin(admin.ModelAdmin): 
    list_display = ('name', 'description', 'plant') 

    def formfield_for_foreignkey(self, db_field, request, **kwargs): 
     if db_field.name == "plant": 
      kwargs["queryset"] = Plant.objects.order_by('name') 
      return db_field.formfield(**kwargs) 
     return super(IngredientAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs) 
+0

감사합니다. 비슷한 방법으로 ManyToMany 필드에서도 가능합니까? – Runcible

+0

많은 필드에'formfield_for_foreignkey'를 사용할 수 없지만 설명대로'__init__' 메소드를 오버라이드 할 수 있습니다. – Alasdair

+0

위와 같이'super (IngredientAdmin, self) .__ init __ (* args, ** kwargs)'행에 대해'super (type, obj) : obj가 유형 또는 인스턴스의 하위 유형이어야합니다. 그냥 명확히하기 위해, 위와 함께 Form = IngredientAdminForm을 설정할 필요가 없습니까? – Runcible