/ / Інтеграція django-select2 (автозаповнення) і django-dynamic-formet (динамічні форми) - django, django-forms

Інтеграція django-select2 (автозавершення) та django-динамічних форм (динамічні форми form) - django, django-forms

Моя програма виглядає так:

forms.py:

class SubForm(forms.ModelForm):

myfield = GreatChoices()
class Meta:
model = Sub

MyFormSet = inlineformset_factory(My, Sub, extra=1, form=SubForm)

class GreatChoices(AutoModelSelect2Field):
queryset = Great.objects

template.html

<form id="great" method="post" action="{% url "great-add" %}">{% csrf_token %}
{{ form }}
<h3>Greats</h3>
<table>
<tbody>
{% for f in formset.forms %}
<tr>
<td>
{% if f.instance.pk %}{{ f.DELETE }}{% endif %}</td>
</tr>
{% endfor %}
</tbody>
</table>
{{ formset.management_form }}
<input id="save_great" type="submit" value="Add">
</form>

і template.js

$(document).ready(function() {
$("form#recipe tbody tr").formset({
prefix: "{{ formset.prefix }}"
});

Це майже спрацьовує - я можу додати один суб-об'єкт до мого набору форм, і подати форму, і це save()s успішно.

Однак, якщо я натискаю кнопку "додати іншу", коли пізніше я натискаю на другий вхід, клонований django-dynamic-formset, автозаповнення з перший Об'єкт formet активується. Схоже, що select2 не знає, що новий рядок додано ...

Я зробив купу читання і, очевидно, формати є новим елементом у select2: https://github.com/applegrew/django-select2/pull/127

Я відчуваю, що я дуже близька до того, щоб вона працювала, і була б вдячна за будь-які покажчики.

Відповіді:

0 для відповіді № 1

Я маю подібне налаштування, але використовую Select2 безпосередньо замість програми Django. У мене була та ж проблема з django-dynamic-Formet і виправлення для мене було змінювати jquery.formset.js , щоб перейти з .clone(true), що є клоном подій, до .clone(false) який клонує структуру, але виключає події jQuery, які вже підключені до існуючого формату.

Зміни прості, виконайте пошук таких рядків:

template = $("." + options.formCssClass + ":last").clone(true).removeAttr("id");

row = options.formTemplate.clone(true).removeClass("formset-custom-template"),

І змінити .clone(true) до .clone(false):

template = $("." + options.formCssClass + ":last").clone(false).removeAttr("id");

row = options.formTemplate.clone(false).removeClass("formset-custom-template"),