慢速Django模型表单集渲染

2024-04-23 15:18:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Django模型表单集,它是用自定义表内联表单集模板中的crispy表单呈现的。表单集是包含实体、逻辑和注释的警报列表。实体和逻辑填充在每个表单中,用户在提交表单之前编写注释。在

表单集目前有140个表单(即警报模型中的140个记录),它需要处理的数量将超过这个数字。alerts.html渲染需要4-5分钟。我可以使用基于Django的分页来限制queryset并减少呈现时间,但这使我无法使用jquerydatatables之类的东西来分页并快速添加JS功能。在

我用django-debug-toolbar来复习。查询绝对是有趣的,并且每个表单都是重复的(即,查询获取实体信息对于每个表单都是重复的,并且还包括重复的where语句)。但是,运行查询只需3-4秒,因此问题肯定出在别处。我使用Chrom dev工具来记录性能,Waiting (TTFB)时间是性能问题的原因。我知道这涉及到服务器端处理,这使我相信这是一个Django问题。在

为什么渲染要花这么长时间?我下面的代码中有什么可以优化的吗?我知道缓存是一种选择,但我相信这主要影响查询性能,而这并不是驱动问题。除了查询之外,还有没有其他的django-debug-toolbar可以更清楚地说明时间安排吗?在

编辑:根据评论,我确定table_inline_formset.html模板中的include标记导致了这个问题,因为它们呈现了数百个相同的模板。我在这里创建了另一个问题来解决这个问题:Crispy-Forms Include Tag Causing Many Duplicate Templates。在

在模型.py公司名称:

^{1}$

在表单.py公司名称:

^{pr2}$

在视图.py公司名称:

    def alerts(request):
        newAlerts = Alert.objects.filter(disposition='')
        formset = AlertFormSet(request.POST or None, queryset=newAlerts)
        helper = AlertFormsetHelper()
        context = {'formset':formset, 'helper':helper}
        if request.method == 'POST':
            for form in formset:
                if form.is_valid():
                    if form.has_changed():
                        if form.is_valid():
                            form.save()
            return HttpResponseRedirect('/alerts')
        return render(request, 'alerts/alerts.html', context)

内联表_表单集.html公司名称:

{% load crispy_forms_tags %}
{% load crispy_forms_utils %}
{% load crispy_forms_field %}
{% specialspaceless %}
{% if formset_tag %}
<form {{ flat_attrs|safe }} method="{{ form_method }}" {% if formset.is_multipart %} enctype="multipart/form-data"{% endif %}>
{% endif %}
    {% if formset_method|lower == 'post' and not disable_csrf %}
        {% csrf_token %}
    {% endif %}
    <div>
        {{ formset.management_form|crispy }}
    </div>
      <div class='table-responsive'>
    <table{% if form_id %} id="{{ form_id }}_table"{% endif%} class="table table-hover table-sm" id='dispositionTable'>
        <thead>
            {% if formset.readonly and not formset.queryset.exists %}
            {% else %}
                <tr>
                    {% for field in formset.forms.0 %}
                        {% if field.label and not field|is_checkbox and not field.is_hidden %}
                            <th for="{{ field.auto_id }}" class="form-control-label {% if field.field.required %}requiredField{% endif %}">
                                {{ field.label|safe }}{% if field.field.required %}<span class="asteriskField">*</span>{% endif %}
                            </th>
                        {% endif %}
                    {% endfor %}
                </tr>
            {% endif %}
        </thead>
        <tbody>
            {% for form in formset %}
                {% if form_show_errors and not form.is_extra %}
                    {% include "bootstrap4/errors.html" %}
                {% endif %}
                <tr>
                    {% for field in form %}
                        {% include 'bootstrap4/field.html' with tag="td" form_show_labels=False %}
                    {% endfor %}
                </tr>
            {% endfor %}
        </tbody>
    </table>
</div>
{% include "bootstrap4/inputs.html" %}
{% if formset_tag %}</form>{% endif %}
{% endspecialspaceless %}

在警报.html公司名称:

{% crispy formset helper %}

Tags: andform名称表单fieldforifis