Django: переопределить RelatedFieldWidgetWrapper - PullRequest
5 голосов
/ 28 января 2010

Я хочу изменить способ отображения значка «+» для внешнего ключа на сайте администратора.

Я обнаружил, что виджет, который печатает код, RelatedFieldWidgetWrapper, который находится в django/contrib/admin/widgets.py.

Итак, я написал свою версию этого класса и изменил функцию render.

Но теперь, как я могу это использовать? Я имею в виду ... в определении моей модели я должен использовать formfield_overrides таким образом?

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

Я думаю, что это не правильный путь, потому что этот виджет управляет не всем внешним ключом, а только значком «+». Я не прав?

Большое спасибо.

Ответы [ 2 ]

4 голосов
/ 28 января 2010

Вам необходимо создать пользовательскую ModelForm для ModelAdmin и переопределить там виджет.

Пример кода:

#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
1 голос
/ 07 марта 2013

Я подошел к этому немного по-другому, применив виджет-патч для виджета - таким образом, изменение отражается во всех формах, и вы не возитесь с исходным кодом django.

Я столкнулся с этим, когда работал над настройкой yawd admin , очень приятной темы для Twitter-Bootstrap для интерфейса администратора. Теперь все мои иконки потрясены.

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
...