按标签按钮删除不起作用

时间:2018-05-30 10:52:15

标签: django-forms modelform formset django-1.11 multi-model-forms

可以在页面(订单)上显示多个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。

1 个答案:

答案 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)