这是我做的方式:
{{ formset.management_form }}
<table>
{% for form in formset.forms %}
{{ form }}
{% endfor %}
</table>
<a href="javascript:void(0)" id="add_form">Add Form</a>
Run Code Online (Sandbox Code Playgroud)
这是JS:
var form_count = {{formset.total_form_count}};
$('#add_form').click(function() {
form_count++;
var form = '{{formset.empty_form|escapejs}}'.replace(/__prefix__/g, form_count);
$('#forms').append(form)
$('#id_form-TOTAL_FORMS').val(form_count);
});
Run Code Online (Sandbox Code Playgroud)
特别困扰我的是我必须自己编写escapejs模板标签.它只是删除所有换行符并转义任何单引号,这样它就不会弄乱我的字符串.但Django制造商到底希望我们在这种情况下做些什么呢?为什么他们有这个TOTAL_FORMS隐藏的领域,当他们刚刚使用了一个数组<input name="my_form_field[0]" />然后计算它的长度?
这大致是我正在尝试做的事情:
def post(request):
VehicleFormSet = formset_factory(StaffVehicleForm)
if request.method == 'POST':
vehicle_formset = VehicleFormSet(request.POST)
if 'add_vehicle' in request.POST:
if vehicle_formset.is_valid():
form_count = vehicle_formset.total_form_count()
vehicle_formset.forms.append(vehicle_formset._construct_form(form_count))
Run Code Online (Sandbox Code Playgroud)
基本上,如果用户单击"添加"按钮并且其条目有效,我想在表单集中添加另一个空白表单,并隐藏前一个表单.
上面代码的问题是我无法弄清楚如何增加total_form_count().我现在拥有它的方式,它将工作一次,然后如果你再次按下它,什么都不会发生,大概是因为form_count是相同的.我也不喜欢打电话_construct_form和依靠内部.
我通过Flask.WTF扩展使用带有Flask的WTForms.不过,这个问题不是Flask特有的.
WTForms包括FieldList字段列表的字段.我想用它来制作一个用户可以添加或删除项目的表单.这将需要某种Ajax框架来动态添加小部件,但WTForms文档没有提及它.
如果用户不完整填写formset中的表单然后将其标记为删除,我的表单处理可怕地死亡.删除的表单会阻止formset.cleaned_data工作,因为它们不验证,因此表单没有cleaning_data属性.如果我尝试迭代formset.deleted_forms并从formset.forms中删除表单,则formset.cleaned_data会因索引超出范围而崩溃.
我应该如何处理用户不想要的这些无效表单?
(这是我的错误,我从谷歌小组复制了描述)
我不明白错误,因为查看django代码我可以读到这个:
def is_valid(self):
"""
Returns True if form.errors is empty for every form in self.forms.
"""
if not self.is_bound:
return False
# We loop over every form.errors here rather than short circuiting on the
# first failure to make sure validation gets triggered for every form.
forms_valid = True
err = self.errors
for i in range(0, self.total_form_count()):
form = self.forms[i]
if self.can_delete: <-------
if self._should_delete_form(form):
# This form is going to be deleted so any …Run Code Online (Sandbox Code Playgroud) 我有一个网页,用户可以动态添加和删除表单到django formsets.
我已经阅读了使用Ajax动态地将表单添加到Django formset,基于此我可以动态地将表单添加到formset.现在我想动态删除formset.我在Django中查看了动态删除内联表单集
我想要这样做的方法是当用户点击删除时,我有一个ajax函数,它从数据库中删除表单实例记录.当我的ajax函数返回时,我保持相同的total_form_count和initial_form_count,只隐藏表单html,以便在我的POST中提交已删除的记录.
最初,formset将其表单元素呈现为:
#form0
<input id="id_formprefix-0-id" type ="hidden "value="something" name="formprefix-0-id">
<input id="id_formprefix-0-field" value="something" type="text" name="formprefix-0-field">
#form1
<input id="id_formprefix-1-id" type ="hidden "value="something" name="formprefix-1-id">
<input id="id_formprefix-1-field" value="something" type="text" name="formprefix-1-field">
#form2
<input id="id_formprefix-2-id" type ="hidden "value="something" name="formprefix-2-id">
<input id="id_formprefix-2-field" value="something" type="text" name="formprefix-2-field">
Run Code Online (Sandbox Code Playgroud)
现在假设我在删除记录后动态删除表单0,使用ajax,我不更改表单计数,因此total_form_count和initial_form_count为3.
(如果我在这种情况下将total_form_count和initial_form_count减少为2,当我在视图中使用POST数据填充formset时,它应该以form0和form1的形式排序.但在我的情况下,有效的表单是form1和form2)
现在在我看来,我做了类似以下的事情来保存我的表格.
myformset = modelformset_factory(ObjectElement,form=Object_Form, extra=0, can_delete=True)
for form in myformset.forms:
print(form.instance.id) #this does not print id of deleted record, but of the first existing record in the database.
print(form.instance.attribute)# this prints …Run Code Online (Sandbox Code Playgroud) 我总是冲突的一件事是如何使用 Django 实现主从应用程序。典型的例子是 Invoice 和 InvoiceLines。
要讨论的事情是:
编辑/添加:
关于自动计算字段,这是我的第一个解决方案,http://pastebin.com/ZGqNnHuC,在模型的保存方法中不是更好吗?
主模型需要来自详细模型的值。(即首先需要计算每个细节的总计,保存每一行,然后求和并保存主数据)它是如何以比调用calculate()方法更Django的方式制作的?
在我的 django 应用程序中,我有两个模型,即Player和Team,它们通过多对多关系连接。要在我的表格中动态添加数据,我想使用 javascript 在我的表单中添加Add row或Remove Row按钮,但无法这样做。
详细信息如下:
模型.py
class Player(models.Model):
pname = models.CharField(max_length=50)
hscore = models.IntegerField()
age = models.IntegerField()
def __str__(self):
return self.pname
class Team(models.Model):
tname = models.CharField(max_length=100)
player= models.ManyToManyField(Player)
def __str__(self):
return self.tname
Run Code Online (Sandbox Code Playgroud)
表格.py
class PlayerForm(forms.Form):
pname = forms.CharField()
hscore= forms.IntegerField()
age = forms.IntegerField()
PlayerFormset= formset_factory(PlayerForm)
class TeamForm(forms.Form):
tname= forms.CharField()
player= PlayerFormset()
Run Code Online (Sandbox Code Playgroud)
视图.py
def post(request):
if request.POST:
form = TeamForm(request.POST)
form.player_instances = PlayerFormset(request.POST)
if form.is_valid():
team= Team()
team.tname= form.cleaned_data['tname']
team.save() …Run Code Online (Sandbox Code Playgroud) 我正在尝试采用crispy-forms和bootstrap,尽可能多地使用它们的功能,而不是一遍又一遍地发明一些东西.
有没有办法使用像django-admin表单那样的crispy-forms/bootstrap具有内联表单功能?
这是一个例子:
class NewProjectForm(forms.Form):
name = forms.CharField(required=True, label=_(u'???????? ???????'), widget=forms.TextInput(attrs={'class':'input-block-level'}))
group = forms.ModelChoiceField(required=False, queryset=Group.objects.all(), label=_(u'?????? ????????'), widget=forms.Select(attrs={'class':'input-block-level'}))
description = forms.CharField(required=False, label=_(u'???????? ???????'), widget=forms.Textarea(attrs={'class':'input-block-level'}))
class Meta:
model = Project
fields = ('name','description','group')
def __init__(self, *args, **kwargs):
self.helper = FormHelper()
self.helper.form_class = 'horizontal-form'
self.helper.form_action = 'submit_new_project'
self.helper.layout = Layout(
Field('name', css_class='input-block-level'),
Field('group', css_class='input-block-level'),
Field('description',css_class='input-block-level'),
)
self.helper.add_input(Submit('submit',_(u'??????? ??????')))
self.helper.add_input(Submit('cancel',_(u'? ?????????')))
super(NewProjectForm, self).__init__(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
它会显示一个体面的形式:

如何添加基本代表此模型的表单:
class Link(models.Model):
name = models.CharField(max_length=255, blank=False, null=False, verbose_name=_(u'????????'))
url = models.URLField(blank=False, null=False, verbose_name=_(u'??????'))
project = models.ForeignKey('Project')
Run Code Online (Sandbox Code Playgroud)
因此会有一个项目和名称/网址链接以及添加许多内容的方式,就像在django-admin中完成相同的事情一样,您可以使用与主模型相关的数据添加额外的"行".在下面的sreenshot中,您可以填写"问题"对象和下面的数据,您可以为QuestionOption对象添加数据 …
我需要javascript/jquery专家帮助解决下一个问题:
---- 1. 此javascript警告select html标记中所选选项的ID:
$(function(){
$("#id_productos_list").change(
function(){
var op = $(this).selectedValues()
alert(op);
}
);
});
Run Code Online (Sandbox Code Playgroud)
---- 2.这个javascript克隆html代码:
function cloneMore(selector, type) {
var newElement = $(selector).clone();
var total = $('#id_' + type + '-TOTAL_FORMS').val();
newElement.find(':input').each(function() {
var name = $(this).attr('name').replace('-' + (total-1) + '-','-' + total + '-');
var id = 'id_' + name;
$(this).attr({'name': name, 'id': id}).val('').removeAttr('checked');
});
newElement.find('label').each(function() {
var newFor = $(this).attr('for').replace('-' + (total-1) + '-','-' + total + '-');
$(this).attr('for', newFor);
});
total++; …Run Code Online (Sandbox Code Playgroud) 我知道如何在djnago中多文件上传.我用:
<form enctype="multipart/form-data" action="" method="post">
{% csrf_token %}
<p>Press control to upload more than image at same time</p>
<input type="file" name="myfiles" multiple>
<input type="submit" name="upload" value="Upload">
</form>
Run Code Online (Sandbox Code Playgroud)
但我想要的是单个文件上传,但允许用户点击"+"按钮并自动创建新的文件上传,允许用户上传多个文件.喜欢在hotmail中附加文件.