Django crispy forms -bootstrap 4 table_inline_formset模板在顶部渲染额外的一行

qacovj5a  于 2023-08-08  发布在  Go
关注(0)|答案(2)|浏览(94)

我使用的是bootstrap4/table_inline_formset.html模板中的FormHelperdjango-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>
...


你知道怎么去掉多余的那一行吗

8yparm6h

8yparm6h1#

我不得不改变模板,删除一开始打印一个空表单的行。
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>

字符串

bakd9h0s

bakd9h0s2#

你知道这张空表格的存在是有原因的吧我很快想到的一个明显的原因是实现动态表单集。例如添加按钮以在表单集中添加/删除行。

相关问题