Размещение данных в форме администратора Django - PullRequest
2 голосов
/ 12 января 2011

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

Возможным решением было бы добавить форму с простой текстовой областью, в которой пользователь мог бы скопировать и вставить всю строку таблицы. Затем представление может разделить данные, предварительно обработать их и опубликовать в стандартной административной форме для соответствующего объекта.

В идеале, он должен вести себя так, как будто пользователь действительно отправил из этой формы: если данные проверяются, объект создается, а если нет, форма (admin) отображается повторно с красивыми красными окнами ошибок.

Так что я подумал, что мне нужно что-то вроде

from django.shortcuts import redirect
[...]
return redirect(to, method=POST, *args)

но, похоже, он недоступен.

Я также думал о передаче данных в виде большой строки запроса, такой как http: //.../admin/app/object/add/? ID = 1234 & name = toto & ... но моя модель имеет много полей, со строками «один ко многим» и «многие ко многим», возможно, длинными текстовыми полями и т. д., поэтому такой подход кажется более сложным, чем необходимо.

Есть идеи, как получить что-то вроде перенаправления POST? или другой подход к этой проблеме?

Ответы [ 3 ]

2 голосов
/ 12 января 2011

Если вы уже пишете код, специфичный для вашей формы, почему бы не создать объекты в этой же функции, вместо того, чтобы пытаться подделать запрос POST на сайт администратора?

Для меня звучит сложнее использовать форму администратора по умолчанию, чем использовать существующее представление предварительной обработки для начала создания или обновления объектов.

Я бы просто подключил ваше представление предварительной обработки к вашему определению ModelAdmin с помощью метода get_urls, настроив шаблон, который может быть таким простым, как

<form action="." method="post">
    <textarea name="data"></textarea>
    <input type="submit" value="submit" />
</form>

и вручную обработайте данные в форме ввода request.POST.get('data', '').split(',') (или что у вас есть) и начните заполнять ваши модели.

По завершении отправьте сообщение и перенаправьте обратно в представление своего приложения или в список изменений.

request.user.message_set.create(message="Finished populating X models")
return http.HttpResponseRedirect('../')
1 голос
/ 13 января 2011

Спасибо за ваши быстрые и информативные ответы!

@ Yuji - Причиной, по которой я хотел бы использовать форму администратора (или любую ModelForm, в этом отношении), является, главным образом, сообщение об ошибке: данные могут содержать ошибки и разрабатывать информативный способ сообщения о них, локализованный в разные языки не кажутся мне СУХИМЫМИ, поскольку в приложении администратора уже есть что-то очень хорошее.

@ S. Лотт - я думал о замене администратора на ModelForm, но отсутствующей частью была идея хранения данных формы в сеансе. Это выглядит как очень многообещающий подход. Я попробую и вернусь сюда, чтобы сообщить, как все прошло.

1 голос
/ 12 января 2011

Для этого вам следует отойти от встроенного интерфейса администратора.

Создайте свой собственный ModelForm http://docs.djangoproject.com/en/dev/topics/forms/modelforms/

Создайте свои собственные функции просмотра, которые выполняют валидацию и POST.

Вероятно, это будет двухэтапная транзакция.

view_function_1

  • если метод GET, представить пустую форму.

  • Если метод POST, они вставили значение в текстовое поле и заполнили «другие» поля.

    Разбор данных в текстовом поле.

    Для полей, которые являются пустыми, заполните пропущенные значения в текстовом поле.

    Поместите данные формы в сеанс.

    Переадресация на URL, который переместится на view_function_2

view_function_2

  • Если метод GET, извлеките данные формы из сеанса, заполните поля и представить форму с данными.

  • Если используется метод POST, проверьте и сохраните результаты.

    перенаправить на страницу, которая будет отображать детали для пользователя.

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