Использование формы с виджетами настраиваемых полей в modelformset_factory? - PullRequest
0 голосов
/ 20 января 2012

Я пытаюсь создать настраиваемую форму в modelformset_factory using jquery.formset.js.Вот код:

Класс настраиваемой формы:

class CustomizedForm(forms.ModelForm):
    date = forms.DateField(widget=JQueryUIDatepickerWidget, required=True )
    time_begin = forms.TimeField(widget=JQueryUITimePickerWidget, required=True, initial=time(0, 0))
    time_end = forms.TimeField(widget=JQueryUITimePickerWidget, required=True, initial=time(23,59))

    def __init__(self, *args, **kwargs):
        super(CustomizedForm, self).__init__(*args, **kwargs)

Класс настраиваемой формы:

class FormSetWithInitialValues(BaseModelFormSet):
    def __init__(self, initials, **kwargs):
        super(FormSetWithInitialValues, self).__init__(**kwargs)
        self.initials = initials

    def save_new(self, form, commit=True):
        for k, val in self.initials.items():
            form.cleaned_data[k] = val
        return form.save(commit=commit)

Фабрика формы:

Formset = modelformset_factory(
                    MyModel,
                    formset=FormSetWithInitialValues,
                    form=CustomizedForm,
                    can_delete=True,
                    extra=1,
                )

проблема следующая.Когда я начинаю страницу, все существующие наборы форм инициализируются с помощью виджетов.Но когда я пытаюсь добавить новую форму в форму, форма создается, но виджеты не связываются с полями формы.Вопрос в том, как связать виджеты с новыми полями формы?

Ответы [ 2 ]

0 голосов
/ 21 января 2012

Решение проблемы следующее. Когда мы добавляем новую форму в набор форм, jquery просто копирует скрытую строку html, соответствующую полям формы, очищает ее и дает новые идентификаторы. Но он не копирует информацию о виджетах. Поэтому мы должны использовать функцию js-callback, которая вызывается после новой формы для добавления в набор форм:

<script src="{{ STATIC_URL }}js/jquery.formset/jquery.formset.js" type="text/javascript"></script>
<script type="text/javascript">

$(function() {
    {% if formset %}
        var datepickerConfig = {};
        datepickerConfig.__proto__ = DatePickerConfig;
        var timepickerConfig = {};
        timepickerConfig.__proto__ = TimePickerConfig;

        $('.calendar_formset_tr').formset({
            prefix : '{{ formset.prefix|escapejs }}',
            deleteText: '&nbsp;<img src="{{ STATIC_URL }}images/icons/delete.png" />',
            addText: '&nbsp;<img src="{{ STATIC_URL }}images/icons/add.png" />',
            addCssClass: 'add_link',
            deleteCssClass: 'remove_link',
            added: function (row) {
                var datePicker = $(row).find('input[name$="date"]');
                if (datePicker.length > 0) {
                    //привязка виджета
                    datePicker.datepicker('destroy').datepicker(datepickerConfig);
                }

                var timeBeginPicker = $(row).find('input[name$="time_begin"]');
                var timeEndPicker = $(row).find('input[name$="time_end"]');
                if (timeBeginPicker.length > 0 && timeEndPicker.length > 0) {
                    //привзяка виджета и проставление значения по-умолчанию
                    timeBeginPicker.val("00.00");
                    timeBeginPicker.timepicker('destroy').timepicker(timepickerConfig);
                    timeEndPicker.val("23.59");
                    timeEndPicker.timepicker('destroy').timepicker(timepickerConfig);
                }
            }
        });
    {% endif %}
});
</script>
0 голосов
/ 20 января 2012

Турал,

Я не понимаю вашего вопроса. Но я публикую этот фрагмент моего кода. Я надеюсь, что это может помочь вам. Это первый подход, мы можем уточнить ответ.

formset_f = modelformset_factory(  ItemQualitativa, extra=20 )

if request.method == 'POST':
    formset = formset_f(request.POST)
    if formset.is_valid():
        formset.save()
else:
    formset = formset_f()

for form in formset:
    form.fields['text'].widget.attrs['size'] = 70 #<-try change widget here.

Что я не понимаю в вашем вопросе, так это предложение: «Но когда я пытаюсь добавить новую форму в набор форм, форма создается». Когда вы пытаетесь добавить новые формы?

С уважением.

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