2010-01-28 4 views
3

Je veux changer la façon dont l'icône "+" de la clé étrangère dans le site d'administration est affichée.Django: override RelatedFieldWidgetWrapper

J'ai trouvé que le widget qui imprime le code est RelatedFieldWidgetWrapper qui se trouve dans django/contrib/admin/widgets.py.

J'ai donc écrit ma version de cette classe et j'ai changé sa fonction render.

Mais maintenant, comment puis-je l'utiliser? Je veux dire ... dans la définition de mon modèle dois-je utiliser le formfield_overrides de cette façon?

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

Je pense que ce n'est pas la bonne façon, parce que ce widget est pas celui qui gère l'ensemble clé étrangère, mais seulement l'icône « + ». Ai-je tort?

Merci beaucoup.

Répondre

2

Vous devez créer un ModelForm personnalisé pour ModelAdmin et remplacer le widget ici.

code Exemple:

#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

pouvez-vous s'il vous plaît écrire un exemple? –

+0

a modifié ma réponse –

1

J'abordé ce peu différemment par singe-patcher le widget - cette façon, le changement se reflète dans toutes les formes et vous n'êtes pas tripoter autour avec le code source de django.

Je me suis heurté à cela pendant que je travaillais sur la personnalisation yawd admin, un très beau skin Twitter-Bootstrap pour l'interface d'administration. Maintenant, toutes mes icônes sont jazzées.

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

Content que vous aimiez yawd-admin! Nous sommes en train de créer un widget personnalisé pour les champs liés dans yawd-admin maintenant (pour utiliser la boîte de sélection select2), donc nous pourrions utiliser l'icône bootstrap exactement comme vous le faites. – ppetrid