2010-05-19 5 views
4

을 편집 할 경우 필드를 제거 내가이 장고 관리 지역을 통해 액세스 할 수있는 모델과 같은 다음 :장고 관리자가 - 객체

# model 
class Foo(models.Model): 
    field_a = models.CharField(max_length=100) 
    field_b = models.CharField(max_length=100) 

# admin.py 
class FooAdmin(admin.ModelAdmin): 
    pass 

가이 전 사용자가 경우 field_a 및 field_b을 보여주고 싶어한다고 가정 해 봅시다 객체를 추가하지만 사용자가 객체를 편집하는 경우 field_a 만 추가합니다. 필드 속성을 사용하는 간단한 방법이 있을까요?

JavaScript가 제대로 작동하지 않는다면 자바 스크립트 솔루션을 해킹 할 수는 있지만 어쨌든 그렇게 할 수는 없습니다.

답변

5

당신은 __init__

class FooForm(forms.ModelForm): 
    class Meta(object): 
     model = Foo 

    def __init__(self, *args, **kwargs): 
     super(FooForm, self).__init__(*args, **kwargs) 
     if self.instance and self.instance.pk: 
      # Since the pk is set this is not a new instance 
      del self.fields['field_b'] 

class FooAdmin(admin.ModelAdmin): 
    form = FooForm 

편집의 필드를 드롭 관리자에 대한 사용자 지정 ModelForm를 만들 수 있습니다 분야 만드는 방법에 대한 요한의 코멘트에서 힌트를 복용 읽기 전용,이 숨겨진 필드 만들 수 값이 변경되지 않도록 정리를 재정의하십시오.

class FooForm(forms.ModelForm): 
    class Meta(object): 
     model = Foo 

    def __init__(self, *args, **kwargs): 
     super(FooForm, self).__init__(*args, **kwargs) 
     if self.instance and self.instance.pk: 
      # Since the pk is set this is not a new instance 
      self.fields['field_b'].widget = forms.HiddenInput() 

    def clean_field_b(self): 
     if self.instance and self.instance.pk: 
      return self.instance.field_b 
     else: 
      return self.cleaned_data['field_b'] 
+0

감사에서 촬영 다음

class FooAdmin(admin.ModelAdmin) def change_view(self, request, object_id, extra_context=None): self.exclude = ('field_b',) return super(SubSectionAdmin, self).change_view(request, object_id, extra_context) 

할 수 있습니다! 그것은 작동해야하지만, 보이는 개체를 편집 할 때 TemplateSyntaxError - "Key 'field_b'폼에서 찾을 수 없습니다". 그게 어떻게 고쳐질 지 알기나 해? –

+0

필자는이 필드를 CharField (처음에는 선택 목록이었습니다)로 변경하고 읽기 전용으로 표시했습니다. 이것은 내 용도에 적합합니다. 뭔가 : self.fields [ 'field_b'] = forms.CharField (초기 = "초기 값"); –

+0

젠장 템플릿을 생성하기 위해 모델의 필드가 아닌 ModelAdmin 필드 세트를 관리자가 사용한다는 사실을 잊어 버렸습니다.하지만 제대로 작동했는지 확인합니다. 아웃. –

관련 문제