inlineformset_factory идентификатор пользовательской формы - PullRequest
1 голос
/ 14 марта 2009

Я пишу веб-приложение, которое использует ajax для добавления новых форм на страницу. Существующие формы создаются с использованием inlineformset_factory. Когда клиентская сторона получает форму, она вставляет ее в правильную позицию и обновляет значение # id_form_type-TOTAL_FORMS "(form_type - это имя формы в этом примере).

Существующие формы имеют имя для каждого поля, например name = "form_type-1-source", где 1 - уникальный идентификатор формы.

Проблема заключается в создании следующего идентификатора для новой формы, чтобы все формы были разными. Я сделал одно решение, но оно мне не нравится.

URL для вызова ajax выглядит так:

(r'^ajax/get_form/(?P<form_type>\w+)$', views.get_form),

Получить вид формы:

def get_form(request, form_type):
    """
    Returns form for requested model if invoken with ajax.
    If invoken directly returns empty string.

    The form is rendered into HTML using as_p method. 
    """
    if request.method == "GET" and request.is_ajax():
        current_forms_no = int(request.GET["current_forms_no"])
        form_class = all_forms[form_type]
        Formset = inlineformset_factory(Component, form_class.Meta.model, extra=current_forms_no + 1, form = form_class, can_delete = False)
        form = Formset()
        return HttpResponse(form.forms[current_forms_no].as_p())
    else:
        return HttpResponse()

И функция JavaScript, которая вызывает это:

function add_new_form(event) {
    event.preventDefault();
    form_type = $(this).attr("href");

    // for id generation
    formset = $("#id_" + form_type + "-TOTAL_FORMS");
    current_forms_no = formset.val()

    container = $(this).parent().parent();
    $.get("/ajax/get_form/" + form_type, {"current_forms_no" : current_forms_no}, function(data) {
        container.append(data);
        container.append("<hr>");

        // increment form count so they can be saved on server
        formset.val(parseInt(formset.val()) + 1);
    })
}

У меня есть более одной формы, поэтому функции являются общими. Я храню form_type в атрибуте href якоря.

Итак, я здесь создаю больше форм, чем мне нужно, и я использую только последние из них.

Итак, есть ли способ сообщить inlineformset_factory, какой идентификатор я хочу создать первым?

PS: простите за мой плохой английский ...

Ответы [ 2 ]

2 голосов
/ 18 марта 2009

Я создал дополнительную скрытую форму, а затем просто скопировал ее с помощью Javascript. То есть скопируйте последнюю форму, сделайте скрытую форму видимой и скройте новую копию формы.

Таким образом, вы можете просто посчитать количество форм на странице и использовать их для мета-переменных Total-Forms.

Некоторая суета должна быть выполнена с атрибутами DELETED, если вы хотите иметь возможность удалять формы на странице. Изменить: Вот одна из моих основных функций с использованием прототипа JS.

function add_form_to_formset(formset, callbacks etc...){
   // Management form
   total_forms_element = $('id_' + formset.prefix + '-TOTAL_FORMS');

   var curr_last_id = biggest_id(formset.form_class);
   var last_form = $('id_' + formset.prefix + '-' + curr_last_id + '-id').up();

   // Copy it
   var new_form = last_form.cloneNode(true);

   ...register some buttons like add/remove etc..

   set_form_id(new_form, curr_last_id+1);

   last_form.show();
   last_form.insert({after:new_form});


   // Increment the management form count
   total_forms_element.value = parseInt(total_forms_element.value) + 1;
0 голосов
/ 19 мая 2011

Вместо генерации фабрики форм-форм вы можете использовать параметр auto_id для создания формы с уникальными идентификаторами:

def get_form(request, form_type):
    current_forms_no = int(request.GET["current_forms_no"])
    form_class = all_forms[form_type]
    form = form_class(auto_id='id_%%s_%s' % current_forms_no)
    return HttpResponse(form.as_p())
...