Django视图运行缓慢

-1 投票
1 回答
55 浏览
提问于 2025-04-12 06:24

我在我的Django项目中有一个视图:

@permission_required('storage.add_iteminrelease')
@transaction.atomic
def add_item_in_release(request, id):
    release = get_object_or_404(Release, pk=id)
    if (request.method == 'POST'):
        add_item_in_release_form = ItemInReleaseForm(request.POST)
        if add_item_in_release_form.is_valid():
            add_item_in_release_form.instance.release = release
            item = add_item_in_release_form.cleaned_data['item']
            if item.count < add_item_in_release_form.cleaned_data['count']:
                messages.add_message(request,
                                     messages.ERROR,
                                     'Кол-во выдачи не должно превышать ' + str(item.count))
                return redirect('/releases/details/' + str(id) + '/')
            item.count -= add_item_in_release_form.cleaned_data['count']
            item.save()
            item_in_release, create = ItemInRelease.objects.get_or_create(item=add_item_in_release_form.cleaned_data['item'],
                                                                          release=release,
                                                                          defaults={'count': add_item_in_release_form.cleaned_data['count']})
            if not create:
                item_in_release.count += add_item_in_release_form.cleaned_data['count']
            item_in_release.save()
            messages.add_message(request,
                                 messages.SUCCESS,
                                 'Позиция успешно добавлена')
            return redirect('/releases/details/' + str(id) + '/')
        messages.add_message(request,
                 messages.ERROR,
                 add_item_in_release_form.errors.as_data())
        return redirect('/releases/details/' + str(id) + '/')
    else:
        add_item_in_release_form = ItemInReleaseForm()
    return render(request,
                    'add_item_in_release.html',
                    {'add_item_in_release_form': add_item_in_release_form,
                     'id': id})

还有一个对应的HTML模板,这个模板是从另一个模板中加载到Bootstrap模态窗口里的:

<div class="modal fade" id="add-item" tabindex="-1" aria-labelledby="add-item-label" aria-hidden="true"
  dats-bs-focus="false">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title" id="add-item-label">Добавление позиции</h5>
        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
      </div>
      <form action="{% url 'storage:add-item-in-release' id %}" method="POST" class="form" novalidate>
        <div class="modal-body">
          {% csrf_token %}
          <div class="form-floating w-100 mb-3">
            {{ add_item_in_release_form.contract }}
            <label for="count">Договор</label>
          </div>
          <div class="input-group flex-nowrap mb-3">
            <div class="form-floating w-100">
              <input class="form-control" id="item-datalist" placeholder="Позиция" name="item"
                type="text" list="items" autocomplete="off">
              <datalist id="items">
                {% for i in add_item_in_release_form.fields.item.queryset %}
                  <option data-value="{{ i.id }}" data-count="{{ i.count }}" data-contract="{{ i.contract }}" value="{{ i.item.manufacturer.name }} {{ i.item.article }} {{ i.contract }}"></option>
                {% endfor %}
              </datalist>
              <label for="item-datalist">Позиция</label>
            </div>
            <button class="btn btn-outline-secondary" type="button" id="clear-input" title="Очистить">
              <i class="fa fa-eraser"></i>
            </button>
          </div>
          <div class="input-group flex-nowrap mb-3">
            <div class="form-floating w-100">
              {{ add_item_in_release_form.count }}
              <label for="count">Кол-во</label>
            </div>
            <span class="input-group-text w-25" id="count-label" title="Максимальное кол-во"></span>
          </div>
        </div>
        <div class="modal-footer">
          <button type="submit" class="btn btn-outline-success">Добавить</button>
          <button type="button" class="btn btn-outline-primary" data-bs-dismiss="modal">Отменить</button>
        </div>
      </form>
    </div>
  </div>
</div>

当我调用这个视图时,页面加载需要10秒钟,但其他页面加载得很快。为什么这个代码这么慢呢?可能是因为我有大约1000个选项在数据列表中?我不太明白。

1 个回答

暂无回答

撰写回答