Django-Admin : Переопределение add-URL кнопки "добавить" автозаполнения внешнего ключа / + зеленый крест

Существует ли простой способ переопределения/передачи параметра во всплывающий url, автоматически создаваемый django-admin встроенным виджетом autocomplete/select2 для создания нового объекта внешнего ключа? Этот url встроен в зеленый крестик (см. рисунок). Я не встретил ни одного хорошо описанного решения.

Итак, url по умолчанию указывает на admin/app/model/add/?_to_field=id&_popup=1, но я хотел бы добавить параметр admin/app/model/add/?_to_field=id&_popup=1&field_1=100, чтобы предварительно заполнить некоторые фиды на всплывающем окне add_view.

Есть зацепки?

add foreign key django admin

'change + -' это результат рендеринга RelatedFieldWidgetWrapper из django.contrib.admin.widgets

Вы можете изменить атрибуты этого виджета, но это немного сложно.

в ModelAdmin.formfield_for_dbfield:

def formfield_for_dbfield(self, *args, **kwargs):
    widget = super.formfield_for_dbfield(self, *args, **kwargs).widget 
    if isinstance(widget, RelatedFieldWidgetWrapper):
        old_context = widget.get_context
        widget.get_context = my_function(widget.get_context, *args, **kwargs)

моя функция является декоратором для старой функции:

def my_function(func, *initargs, **initkwargs):
    def wrapped(*args, **kwargs):
        context = func(*args, **kwargs)
        your_keys_vals_to_add_in_url = 'something in form key=val&'
        context['url_params'] = f'{context['url_params']}&{your_keys_vals_to_add_in_url}'
        return context
    return wrapped

Другая возможность - изменить template related_widget_wrapper.html на django.admin.contrib.templates.admin.widgets Там вы можете жестко закодировать свои значения.

в ModelAdmin.formfield_for_dbfield:

def formfield_for_dbfield(self, *args, **kwargs):
    widget = super.formfield_for_dbfield(self, *args, **kwargs).widget
    if isinstance(widget, RelatedFieldWidgetWrapper):
        widget.template_name = 'path/to/your_overriden_related_widget_wrapper.html'
        widget.attrs.update('your_parameter' : 'you can use it after in template')
Вернуться на верх