Django 脆皮表单 - bootstrap4 table_inline_formset 模板在顶部渲染额外的行

问题描述 投票:0回答:2

我正在使用

bootstrap4/table_inline_formset.html
中的
FormHelper
中的
django-crispy-forms
模板。表格在模板中正确呈现,但表格开头总是出现额外的表单,提交表单时不可见。

forms.py:

class MetricForm(forms.ModelForm):
    class Meta:
        model = Metric
        exclude = ['auto_value','occurrence']

class MetricFormSetHelper(FormHelper):
    def __init__(self, *args, **kwargs):
        super(MetricFormSetHelper, self).__init__(*args, **kwargs)
        self.add_input(Submit('submit', 'Submit', css_class="btn btn-success"))
        self.template = 'bootstrap4/table_inline_formset.html'

views.py:

@login_required
def create_occurrence(request, pk):
    try:
        site = Site.objects.get(id=pk)
    except Site.DoesNotExist:
        raise Http404("Site does not exist")
    form = OccurrenceForm(request.POST or None, initial={'site':site})
    MetricFormset = modelformset_factory(Metric, form=MetricForm, extra=3)
    formset = MetricFormset(queryset=Metric.objects.none())
    helper = MetricFormSetHelper()
    if form.is_valid():
        occurrence = form.save(commit=False)
        occurrence.added_by = request.user
        occurrence.site = site
        occurrence.save()
        form.save_m2m()
        metric_formset  = MetricFormset(request.POST)
        if metric_formset.is_valid():
            for metric_form in metric_formset.forms:
                if all([metric_form.is_valid(), metric_form.cleaned_data != {}]):
                    metric = metric_form.save(commit=False)
                    metric.occurrence = occurrence
                    metric.save()
        messages.success(request, "Occurrence created successfully.")
        execute_from_command_line(["../manage_dev.sh", "updatelayers", "-s", "archaeology"])
        return redirect(occurrence.get_absolute_url())
    context = {
        'form': form,
        'site':site,
        'formset':formset,
        'helper': helper,
    }
    return render(request, "archaeology/occurrence_form.html", context=context)

模板:

...
<form action="" method="post">
        {% csrf_token %}
        {{ form|crispy }}
        <h4>Metrics</h4>
        {{ formset.management_form }}
        {% crispy formset helper %}
        {% if form.instance.pk != None %}
        <a class="btn btn-danger" href="{% url 'delete_occurrence' occurrence.id %}">{% trans "Delete" %}</a>
        {% endif %}
    </form>
...

知道如何删除多余的行吗?

django bootstrap-4 django-crispy-forms formset form-helpers
2个回答
0
投票

我必须更改模板并删除开头打印空表单的行。

table_inline_formset.html:

<tr class="d-none empty-form">
    {% for field in formset.empty_form %}
        {% include 'bootstrap4/field.html' with tag="td" form_show_labels=False %}
    {% endfor %}
</tr>

0
投票

您确实意识到这个空表格的存在是有原因的,对吗? 很快想到的明显原因是实现动态表单集。 就像添加按钮来从表单集中添加/删除行一样。

© www.soinside.com 2019 - 2024. All rights reserved.