可以在页面(订单)上显示多个DEVICE表单,作为选项卡。当用户关闭标签并点击save
,然后租用该特定订单(ID)时,用户仍会看到他删除的标签。作为一种快速解决方法,html代码中内置了一个复选框,但这不是必需的。
目前,view.py
中的代码如下所示。
def edit_order(request,id = None, order_id = None):
order = Order.objects.get(id=id)
'''some stuff'''
if request.method == 'POST':
formCustomer = CustomerModelForm(request.POST,instance=Customer.objects.get(order=order.id))
formInfo = InfoModelForm(request.POST,instance=Info.objects.get(order=order.id))
DBFormSet = modelformset_factory(DB, extra=1, can_delete=True, form=LUNModelForm)
formset = DBFormSet(request.POST or None, queryset=DB)
if formset.is_valid():
for i,frm in enumerate(formset.forms):
if frm.cleaned_data['id']:
if frm.is_valid():
if not frm.cleaned_data['capacityGB'] > 0:
frm.cleaned_data['id'].delete()
elif frm.cleaned_data['DELETE'] == True:
frm.cleaned_data['id'].delete()
#frm.save() or formset.save() ??
else:
dev = frm.cleaned_data['id']
dev.capacity = frm.cleaned_data['capacity']
dev.save()
我怀疑标签没有保持关闭的问题是“can_delete
”的问题,但是当我添加它时它似乎没有什么区别。然后我read该问题可能与formset.save
有关,而 <ul class="nav nav-tabs" id="tab4Headers">
{% for form in formsetDEVICE.forms %}
{% if forloop.first %}
{% if form.errors %}
<li class="active"><a href="#tab4_{{forloop.counter}}" data-toggle="tab">DEVICE <i class="icon-warning-sign"></i> </a></li> <!-- section 4.1 -->
{% else %}
<li class="active"><a href="#tab4_{{forloop.counter}}" data-toggle="tab">DEVICE</a></li> <!-- section 4.1 -->
{% endif %}
{% else %}
{% if form.errors %}
<li><a href="#tab4_{{forloop.counter}}" data-toggle="tab"><button class="close" type="button" id="close-tab4_{{forloop.counter}}">×</button>DEVICE <i class="icon-warning-sign"></i> </a></i></li> <!-- section 4.2 ... 4.n -->
<!--{% if formsetDEVICE.can_delete %}
<li>{{ form.DELETE }}</li>
{% endif %}-->
{% else %}
<li><a href="#tab4_{{forloop.counter}}" data-toggle="tab"><button class="close" type="button" id="close-tab4_{{forloop.counter}}">×</button>DEVICE</a></li> <!-- section 4.2 ... 4.n -->
<!--{% if formsetDEVICE.can_delete %}
<li>{{ form.DELETE }}</li>
{% endif %}-->
{% endif %}
{% endif %}
{% endfor %}
</ul>
也没有解决任何问题。在html代码下面:
HTML:
save
由于不清楚如何通过关闭选项卡(然后点击 {# --- delete item --- #}
{% if form.instance.pk %}
{# render row for DELETE-flag only for forms with existing instance #}
<tr>
<td colspan="2">
</td>
<td colspan="2">
edit Action required: <br/><br/>
{{form.DELETE|safe}} delete this DEVICE from the Order.
</td>
</tr>
{% endif %}
{# --- END delete item --- #}
按钮)来删除选项卡,当前的解决方法只是在选项卡上插入一个包含复选框的部分,如此:
frm.cleaned_data['DELETE']
当前的解决方法有效,但这不是所需的功能。我已经尝试了一些here的建议,但无济于事。我认为这个问题与html和view.py之间的联系更为相关(所以与A**************************************************************************
A*
A*-------------------------------------------------------------------------
A*
A R TESTPFR
A
A FLD01 2S 0
A FLD02 20A
A
A**************************************************************************
有关,尽管我可能错了。
修改
我怀疑要解决这个问题,需要插入js代码和/或css。
答案 0 :(得分:1)
我遇到了与 inlineformset_factory 相同的问题。阅读基础Django类,我发现问题似乎在 BaseFormSet 类(或类似的),_should_delete_form()
方法查找表单 DELETE < / strong> cleaning_data中的值,但是使用调试我发现clean_data中不存在 DELETE 值,在填充cleaning_data时, DELETE 字段都不存在
我认为这可能是因为DELETE字段是由FormSet类动态创建的,但是在创建DELETE字段之前,在Forms类中填充了cleaning_data(在表单init的某个地方?),因为这个字段不是存在,cleaning_data DELETE值未被填充。
在基本FormSet类的某处,动态创建的DELETE字段值必须包含在cleaning_data中,但是我找到了一个快速而临时的解决方案,添加删除表单类的字段:
class RutinaForm(ModelForm):
DELETE = forms.BooleanField(required=False, widget=forms.CheckboxInput())
class Meta:
model = Rutina
fields = '__all__'
exclude = ('usuario',)
widgets = { .........}
这样DELETE字段就存在,所以它的值被清理并添加到cleaning_data 这可以看作是&#34; machetazo&#34;,但它有效!至少是暂时的。我将继续阅读基本代码并查看它是否是错误,或者发生了什么。
注意:对不起我的英语,我不是专家,所以请给我你的意见。
如果您需要,或者如果您能找到错误的话,这是我的观点:
rutinaFormSet = inlineformset_factory(Usuario, Rutina, form=RutinaForm, can_delete=True, extra=1)
if request.method == 'POST':
formSet = rutinaFormSet(request.POST, instance=usuario)
if formSet.is_valid():
formSet.save()
else:
formSet = rutinaFormSet(instance=usuario)