Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 在modelformset_工厂中使用带有自定义字段小部件的表单?_Django_Django Forms - Fatal编程技术网

Django 在modelformset_工厂中使用带有自定义字段小部件的表单?

Django 在modelformset_工厂中使用带有自定义字段小部件的表单?,django,django-forms,Django,Django Forms,我正在尝试使用jquery.formset.js在modelformset\u工厂中创建自定义表单。 下面是一个代码: 自定义表单类: class CustomizedForm(forms.ModelForm): date = forms.DateField(widget=JQueryUIDatepickerWidget, required=True ) time_begin = forms.TimeField(widget=JQueryUITimePickerWidget, r

我正在尝试使用jquery.formset.js在modelformset\u工厂
中创建自定义表单。
下面是一个代码:

自定义表单类:

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,
                )
问题是下一个。当我初始化页面时,所有现有的表单集都会用小部件初始化。但是,当我尝试向表单集中添加新表单时,表单是create,但是小部件与表单的字段不匹配。问题是,如何将小部件与新表单的字段联系起来

我不明白你的问题。但是,我发布了这段代码。我希望这能对你有所帮助。这是第一种方法,我们可以细化答案

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.
formset\u f=modelformset\u工厂(itemstativa,额外=20)
如果request.method==“POST”:
formset=formset\u f(request.POST)
如果formset.is_有效():
formset.save()
其他:
formset=formset_f()
对于formset中的表单:

接下来是form.fields['text'].widget.attrs['size']=70#问题解决。当我们向表单集中添加一个新表单时,jquery只复制表单字段对应的隐藏html行,清理它,并给出新的ID。但它不会复制有关小部件的信息。所以我们应该使用新表单后调用的js回调函数来添加表单集:

<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>

$(函数(){
{%if formset%}
var datepickerConfig={};
datepickerConfig.\uuuuu proto\uuuuuu=datepickerConfig;
var timepickerConfig={};
timepickerConfig.\uuuu proto\uuuuu=timepickerConfig;
$('.calendar\u formset\u tr').formset({
前缀:“{formset.prefix | escapejs}}”,
删除文本:“”,
addText:“”,
addCssClass:“添加链接”,
deleteCssClass:“删除链接”,
新增:功能(行){
var datePicker=$(行).find('input[name$=“date”]”);
如果(datePicker.length>0){
//привязка виджета
datePicker.datePicker('destroy').datePicker(datepickerConfig);
}
var timeBeginPicker=$(行).find('input[name$=“time_begin”]');
var timeEndPicker=$(行).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%}
});

感谢您的回答。在这句话中,我想说的是添加新的formset元素。因为表单集包含表单,所以我写了“当我尝试向表单集添加新表单时”的django modelFormFactory javascript代码可以自动向html表单集添加新表单吗?你能给我发一个链接来记录或解释这一点吗?django modelFormFactory是否有自动向html表单集添加新表单的javascript代码?你能给我发一个链接来记录或解释这一点吗?我认为你看起来不错,但这些信息应该包括在你的问题中。你的问题应该以“我使用Django动态表单集和…”开头。这就是为什么没有人回答你的问题。