Django Admin: предварительное заполнение значений из POST или GET? - PullRequest
8 голосов
/ 07 февраля 2011

На моем сайте Django 1.2.4 я хотел бы направить пользователя на страницу администратора, которая предварительно заполнена некоторыми значениями на основе текущих данных, с которыми они работают.Например:

{% for person in people %}
    <tr>
        <td>{{person}}</td>
        <td><a href='admin/foo/bar/add?name={{person}}'>Create a foo for {{person}}</td>
    </tr>
{% endfor %}

Затем, когда пользователь нажимает на ссылку, поле name предварительно заполняется значением {{person}}.

. Поддерживает ли интерфейс администратора Djangoделая это?Административные формы Django используют POST, но я не уверен, как добавить данные POST к запросу из шаблона.

Или я мог бы установить переменные GET, а затем использовать собственный JavaScript-код в форме для установки значений соответственно.

1 Ответ

13 голосов
/ 07 февраля 2011

Согласно исходному коду (и быстрому тесту), Django поддерживает использование параметров GET в качестве начальных значений для моделей моделей в админке. Он даже поддерживает отношения «многие ко многим».

Вы пробовали это? Может быть, это пропущенная косая черта в конце URL.

admin/foo/bar/add?name=Foobar

Вероятно, перенаправляется на ...

admin/foo/bar/add/

... таким образом отбрасывая строку запроса. Поэтому попробуйте добавить туда косую черту и посмотреть, работает ли она.

admin/foo/bar/add/?name={{ person }}

Обновление (предварительное заполнение логических полей)

На случай, если у кого-то еще возникнут проблемы с предварительным заполнением логических полей:

Если вы передаете какое-либо значение в строку запроса, например, admin/foo/bar/add/?is_active=foo, это заполнит поле is_active значением True (поскольку любая непустая строка является истинным значением). Поэтому, если вы хотите снять флажок для данного поля, вообще не передавайте значение, например admin/foo/bar/add/?is_active=


Это фрагмент кода из метода add_view в ModelAdmin, отвечающий за использование параметров GET в качестве начальных значений. http://code.djangoproject.com/browser/django/trunk/django/contrib/admin/options.py#L878

# Prepare the dict of initial data from the request.
# We have to special-case M2Ms as a list of comma-separated PKs.
initial = dict(request.GET.items())
for k in initial:
    try:
        f = opts.get_field(k)
    except models.FieldDoesNotExist:
        continue
    if isinstance(f, models.ManyToManyField):
        initial[k] = initial[k].split(",")

form = ModelForm(initial=initial)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...