2010-01-28 2 views
3

관리 사이트의 외래 키에 대한 "+"아이콘이 표시되는 방식을 변경하고 싶습니다.Django : Override RelatedFieldWidgetWrapper

코드를 인쇄하는 위젯이 django/contrib/admin/widgets.pyRelatedFieldWidgetWrapper이라는 것을 발견했습니다.

그래서이 클래스의 제 버전을 작성하고 해당 render 함수를 변경했습니다.

하지만 어떻게 사용할 수 있습니까? 내 모델의 정의에서 이런 식으로 formfield_overrides을 사용해야합니까?

formfield_overrides = { 
     models.ForeignKey: {'widget': customRelatedFieldWidgetWrapper}, 
} 

은 그 위젯 만 "+"아이콘 전체 외래 키를 관리하는 일이 아니라 있기 때문에 이것이 올바른 방법이 아니라고 생각. 내가 틀렸어?

고마워요.

답변

2

ModelAdmin 용 사용자 정의 ModelForm을 작성하고 거기에서 위젯을 대체해야합니다.

예제 코드 :

#forms.py 
class CustomForm(forms.ModelForm): 
    user = forms.ModelChoiceField(queryset=User.objects.all(), widget=yourCustomWidget) 

class Meta: 
    model = MyModel 

#admin.py 
class MyModelAdmin(admin.ModelAdmin): 
    form = CustomForm 
+0

사례를 작성해주세요. –

+0

내 대답을 편집했습니다 –

1

내가 원숭이 패치 위젯에 의해 약간 다르게이 접근 - 변경 사항이 모든 형태에 반영되는 방법을 당신이 장고의 소스 코드와 함께 돌아온다 아닙니다.

관리자 인터페이스 용으로 매우 유용한 Twitter-Bootstrap 스킨 인 yawd admin을 맞춤 설정하려고 할 때이 문제가 발생했습니다. 이제 모든 아이콘이 재밌어졌습니다.

import django.contrib.admin.widgets 

class MyRelatedFieldWidgetWrapper(django.contrib.admin.widgets.RelatedFieldWidgetWrapper): 
    """ 
    This class is a wrapper to a given widget to add the add icon for the 
    admin interface. 
    """ 
    def render(self, name, value, *args, **kwargs): 
     rel_to = self.rel.to 
     info = (rel_to._meta.app_label, rel_to._meta.model_name) 
     self.widget.choices = self.choices 
     output = [self.widget.render(name, value, *args, **kwargs)] 
     if self.can_add_related: 
      related_url = reverse(
       'admin:%s_%s_add' 
       % info, current_app=self.admin_site.name 
      ) 
      output.append(
      """ 
      <a href="%s" 
       onclick="return showAddAnotherPopup(this); 
       alt="%s"> 

       <i class="help icon-large icon-plus-sign" 
        id="add_id_%s" 
        data-original-title> 
       </i> 
      </a>""" % (related_url, _('Add Another'), name)) 
      return mark_safe(''.join(output)) 

# Monkeypatch it 
django.contrib.admin.widgets.RelatedFieldWidgetWrapper = MyRelatedFieldWidgetWrapper 
+1

yawd-admin을 좋아해서 다행입니다! 우리는 바로 yawd-admin의 관련 필드에 대한 사용자 정의 위젯을 생성하는 중입니다 (select2 선택 상자 사용). 그러면 부트 스트랩 아이콘을 정확하게 사용할 수 있습니다. – ppetrid