我有一个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 %}
目前没有回答
相关问题 更多 >
编程相关推荐