2012-01-20 4 views
0

제목과 마찬가지로 양식에 렌더링 된 필드를 바꾸고 싶습니다. 예를 들어 나는 다음과 같은 모델이 있습니다권한에 따라 AdminPage에서 렌더링 된 필드 유형/위젯을 교환하십시오.

models.py 
class Project(models.Model): 
    name = models.TextField(max_length=200) 
    finished = models.BoolenField(default=False) 

admin.py 
class ProjectAdmin(admin.ModelAdmin): 
    def get_form(self, request, obj=None, **kwargs): 
     if request.user.is_superuser: 
      #here change the name field form TextField 
      #to a disabled TextField or to other Field defined by me 
      self.form['name']['widget] = MySuperDuperWidgetField() #or smth like that 

이 가능를?

답변

1

ModelAdmin 서브 클래스에서 formfield_for_dbfield 메소드를 대체해야합니다. 그 안에는 요청, 현재 사용자 및 개체 인스턴스를 검사하고 올바른 양식 필드를 결정할 수 있습니다 (사용자 정의 위젯이 필요한 경우)

(formfield_for_dbfield는 문서화되지 않았으므로 책임지고 수행하십시오. :)) 문제의 필드가 외래 키, m2m 또는 선택 필드라는 것을 알고 있으면이를 재정의 할 수있는 문서화 된 메서드가 있습니다.

class ProjectAdmin(admin.ModelAdmin): 
    def get_form(self, request, obj=None, **kwargs): 
     ModelForm = super(ProjectAdmin, self).get_form(request, obj=None, **kwargs) 
     class PermissionedModelForm(ModelForm): 
      def __init__(self, *args, **kwargs): 
       super(PermissionedModelForm, self).__init__(*args, **kwargs) 

       if request.user.is_superuser: 
        self.fields['name'].widget = MySuperDuperWidgetField() 

     return PermissionedModelForm 

편집 IanClelland의 대답이 더 적합 @ 필드의 위젯을 변경하는 것과 같은 간단한에 대한 사실

하지만 경우 :

1

예, 당신이 그것을 가지고 꽤처럼 가능하지만,하지 당신은 그 이상으로 복잡한 것을 할 필요가 있습니다.이 접근법은 갈 길입니다.

관련 문제