Элегантное решение для нескольких форм на одной странице - PullRequest
2 голосов
/ 11 января 2011

Я создаю веб-приложение (в Django), которое будет принимать критерии поиска и отображать отчет - как только пользователь будет удовлетворен результатами, сохраните оба критерия и ссылку на эти объекты обратно в базу данных.

Проблема, с которой я сталкиваюсь, заключается в поиске элегантного решения для двух форм:

  1. Отображение (GET) результатов их критериев.
  2. Введите в некоторых описанияхи сохранить (POST) все обратно в базу данных.

Я склоняюсь к AJAX для GET и POST для сохранения, но я хотел убедиться, что не было болееэлегантное решение в первую очередь.

Ответы [ 2 ]

6 голосов
/ 11 января 2011

Перед внедрением ajax я попытаюсь заставить формы работать с отключенным javascript.2 формы могут указывать на один и тот же вид.Для маршрутизации действия можно использовать <button type="submit"> теги с заполненными атрибутами name value вместо <input type="submit">.

Шаблон 2 форм

<form action="{% url your-url %}" method="get">
  <input type="text" name="q" value="{{ q }}">
  <button type="submit" name="action" value="search">Search</button>
</form>

{% if entries %}
  ...
  <form action="{% url your-url %}" method="post">
    <input type="hidden" name="q" value="{{ q }}">
    <button type="submit" name="action" value="save">Save entries</button>
  </form>
{% endif %}

Не такодин уродливый шаблон формы

<form action="{% url your-url %}" method="post">
  <input type="text" name="q" value="{{ q }}">

  <button type="submit" name="action" value="search">Search</button>

  {% if entries %}
    ...
    <button type="submit" name="action" value="save">Save entries</button>
  {% endif %}
</form>

Затем поймайте "действие" в своем представлении, как этот код (не проверено)

def your_view(request, *args, **kwargs):
    action = request.REQUEST.get('action', None)
    if request.method == 'POST' and action == 'save':
        # do the save stuff
    elif action == 'search':
        # no need to check if it's a GET
        if request.REQUEST.get('q', None):
            # do the display stuff
        else:
            # q required, maybe push a warning message here
    else:
        # default stuff

    return # the response ...

Тогда вы можете немного ajax

0 голосов
/ 11 января 2011

Мне кажется, что ваш список для сохранения должен быть создан с помощью formset_factory (http://docs.djangoproject.com/en/dev/topics/forms/modelforms/#model-formsets). На самом деле нет причин перебирать запрос. POST ['list']. Getitems (), когда вы собираетесь сохранять модели в любом случае.

Настройка вида / контроллера Ксавье верна для поиска либо для поиска, либо для отправки формы.

...