Django 在modelformset_工厂中使用带有自定义字段小部件的表单?
我正在尝试使用jquery.formset.js在modelformset\u工厂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
中创建自定义表单。
下面是一个代码:
自定义表单类:
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: ' <img src="{{ STATIC_URL }}images/icons/delete.png" />',
addText: ' <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动态表单集和…”开头。这就是为什么没有人回答你的问题。