Удаление кнопкой вкладки не работает - PullRequest
0 голосов
/ 30 мая 2018

Несколько страниц УСТРОЙСТВА могут отображаться на странице (Заказ) в виде вкладок.Когда пользователь закрывает вкладку и нажимает 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", но, кажется, это не имеет значения, когда я добавил это.Затем я прочитал , что проблема может быть связана с formset.save, который также ничего не решил.Ниже html-кода:

html:

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

Поскольку не ясно, как удалить вкладку, закрыв вкладку (а затем нажав кнопку 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 --- #}

Текущий обходной путь работает, но это не желаемая функциональность.Я попробовал некоторые из предложенных вариантов здесь , но безрезультатно.Я думаю, что проблема больше связана со ссылкой между html и view.py (поэтому что-то делать с frm.cleaned_data['DELETE'], хотя я могу ошибаться.

РЕДАКТИРОВАТЬ:

Я подозреваю, что нужно обойти это, JS-код и / или CSS должны быть вставлены.

1 Ответ

0 голосов
/ 12 июня 2018

У меня была такая же проблема с inlineformset_factory .Читая базовые классы Django, я обнаружил, что проблема, похоже, в классе BaseFormSet (или что-то подобное), метод _should_delete_form() ищет формы DELETE значение в cleaned_data, но с помощью отладки я обнаружил, что значение DELETE не существует в cleaned_data, а также поле DELETE не существует к моменту заполнения cleaned_data.

Я думаю, это может быть связано с тем, что поле DELETE динамически создается классами FormSet, но cleaned_data заполняется классом Form до создания поля DELETE (где-то в формах init? Может быть), так как это поле не существует, cleaned_data DELETEзначение не заполняется.

Где-то в базовых классах FormSet динамически созданное значение поля DELETE должно быть включено в cleaned_data, НО Я нашел быстрое и временное решение этой проблемы, Добавить поле DELETE к классу формы:

class RutinaForm(ModelForm):
    DELETE = forms.BooleanField(required=False, widget=forms.CheckboxInput())

    class Meta:
        model = Rutina
        fields = '__all__'
        exclude = ('usuario',)
        widgets = { .........}

Таким образом, поле DELETE существует, поэтому его значение получает cleaned и добавлено в cleaned_data.
Это можно увидеть как "machetazo", но это работает!по крайней мере временно.Я продолжу читать базовый код и посмотрю, если это ошибка, или что происходит.

Примечание: Извините за мой английский, и я не эксперт, поэтому ПОЖАЛУЙСТА, дайте мне ваши комментарии.

Это мое мнение, если вам это нужно, или если вы можете найти, что не так:

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