【问题标题】:Django App Not Communicating with JavaScript Code BlockDjango 应用程序不与 JavaScript 代码块通信
【发布时间】:2019-11-09 21:33:07
【问题描述】:

我有一个 Django 应用程序,它接受表单中的 Elasticsearch 查询 并生成可下载的报告。较早的迭代效果很好,但我们决定添加一个组件,该组件每十秒检查一次是否已完成创建报告。我们的最终目标是让它反复检查已完成的报告(如果未完成,则告诉用户报告仍在处理中),然后添加一个按钮来下载报告或让它自动开始下载。

但是,我的应用程序似乎没有调用 form.html 中的 javascript 块。当我运行它时,它会显示{"file_created": False},直到我手动刷新自己,然后它会切换到 True。我尝试了check_progress 中注释掉的代码(这基本上是我在 form.html 中的代码所做的......)但它返回了一个错误。

如何让他们交流?我错过了什么?

views.py

from django.shortcuts import render
from django.contrib.auth.decorators import login_required
from django.http import HttpResponse, JsonResponse, HttpResponseRedirect
import os
import threading
from .forms import QueryForm
from .models import *


@login_required
def get_query(request):
    if request.method == 'POST':
        form = QueryForm(request.POST)
        if form.is_valid():
            query = form.cleaned_data["query"]
            t = threading.Thread(target=generate_doc, args=(query,))
            t.start()
            return HttpResponseRedirect('/check_progress/')
        else:
            return HttpResponse("Your query does not appear to be valid. Please enter a valid query and try again.")
    else:
        form = QueryForm()
        return render(request, 'audit_tool/form.html', {'form': form})


@login_required
def check_progress(request):
    """
    Returns whether document generation is complete or in progress
    """
    # check if file exists, return response as a JSON
    # how to integrate with js code in html to continuously check and refresh
    # only shows true when refreshed; how to talk to html??
    file = "/report.docx"
    data = {
        "file_created": os.path.exists(file)
    }
    # if os.path.exists(file):
        # response = generate_doc(query)
        # return response
    # else:
        # return HttpResponseRedirect('/check_progress/')
        # this does not work, "10.168.83.100 redirected you too many times.
        # Try clearing your cookies.
        # ERR_TOO_MANY_REDIRECTS"
    return JsonResponse(data)


@login_required
def return_doc(request):
    """
    Returns file response upon user request, or error message if something goes wrong
    """
    response = generate_doc(query)
    return response

form.html

<!-- templates/django_audit/form.html -->
{% extends 'base_login.html' %}

{% block javascript %}
  <script>
    var checkInterval = setInterval(isFileComplete, 10000); //10000 is 10 seconds

    function isFileComplete() {

        $.ajax({
        url: '/check_progress/',
        type: 'GET',
        data: {
            'file_created': 'True'
        },
        dataType: 'json',
        success: function (data) {
            if (data.exists) {
                alert("Your file is ready to download!");
                clearInterval(checkInterval);
            } else {
                alert("Your report is still being created, please hold.");
            }
        }
    });
   }
  </script>
{% endblock %}

{% block title %}Form{% endblock %}
{% block content %}
<p><br></p>
<p><br></p>
<div class="alert alert-primary" role="alert">
  <b>Instruction:</b>
  {% load crispy_forms_tags %}
  <!-- form action="/report/" method="post" onsubmit="this.submit(); this.reset(); return false; -->
  <form action="/report/" method="post" onsubmit="this.submit(); this.reset(); return false;">
      {% csrf_token %}
      {{ form|crispy }}
      <input type="submit" value="Submit">
  </form>
</div>
{% endblock %}

core/urls.py

from django.contrib import admin
from django.urls import include, path
from django.views.generic.base import TemplateView
from django.conf import settings
from django.conf.urls.static import static
from audit_tool import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('accounts/', include('django.contrib.auth.urls')),
    path('form/', include('audit_tool.urls')),
    path('report/', include('audit_tool.urls')),
    path('check_progress/', views.check_progress, name='check_progress'),
    path('', TemplateView.as_view(template_name='home.html'), name='home'),
]  + static(settings.STATIC_URL, document_root=settings.STAT)

audit_tool/urls.py

from django.urls import path
from . import views
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    path('', views.get_query, name='form'),
]  + static(settings.STATIC_URL, document_root=settings.STAT)

base_login.html

<!-- templates/base.html -->
<!DOCTYPE html>
<html>
<html lang="en">
{% load static %}
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <link rel="stylesheet" href="{% static 'bootstrap/css/bootstrap.min.css' %}">
    <link rel="shortcut icon" href="link/to/company/iconicon.ico" type="image/vnd.microsoft.icon" />
    <title>Audit Report Tool</title>
  </head>
  <nav class="navbar navbar-expand-lg navbar-dark bg-dark">
    <a class="navbar-brand" href="#">Dept</a>
    <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
      <span class="navbar-toggler-icon"></span>
    </button>
    <div class="collapse navbar-collapse" id="navbarSupportedContent">
      <ul class="navbar-nav mr-auto">
        <li class="nav-item active">
          <a class="nav-link" href="../">Home</a>
        </li>
        <li class="nav-item">
          <a class="nav-link" href="../admin">Admin</a>
        </li>
      </ul>
    </div>
  </nav>
  <div class="container">
    <div class="row justify-content-center">
      <div class="col-8">
        <hr class="mt-0 mb-4">
        <img src="{% static "logo.png" %}" alt="Company Logo" align="left"></img>
        <img src="{% static "logo.png" %}" alt="Dept Logo" align="right" width="140" height="140"></img>
        <h1 align="center"><font size="6"> Audit Report Tool</font></h1>
      </div>
    </div>
  </div>
<body>
  <main>
    {% block content %}
    {% endblock %}
  </main>
</body>
</html>

【问题讨论】:

    标签: javascript python django django-views


    【解决方案1】:

    您的密钥是data.file_created,而不是if (data.exists) { 行中的data.exists。发送data: {'file_created': 'True'},在你的javascript中去掉它——你没有在你的视图中查询任何请求,例如文件名,所以你不需要填写@987654325 @。

    还有以下内容:

    file = "/report.docx"
    data = {
        "file_created": os.path.exists(file)
    }
    

    这意味着report.docx 将被保存在文件系统的根目录中,这不会发生。使用类似

    from django.conf import settings
    os.path.join(settings.BASE_DIR, "../upload/", "report.docx")
    

    另外,您可以提供base_login.html 中放置{% block javascript %} 的部分。

    【讨论】:

    • 那么在 check_status 函数中file = ... 应该在哪里替换为 os.path.join 呢?还是应该把它放在外面,函数内的代码保持不变?
    • 在您创建上传目录后,将其放在那里,如file = os.path.join(settings.BASE_DIR, "../upload/", "report.docx")。如果删除作为文件名前缀的斜杠,只保留文件名,那么 Python 将在当前工作目录中查找。除了“/filename”之外的任何东西,这是 django url 的快捷方式,而不是文件。
    • 我做了建议的编辑,但它仍然没有与 javascript 代码通信,因为我没有看到任何一种方式弹出警报(它会告诉我它已经准备好了,或者它仍然在职的)。如何让它与 javascript 块通信?
    • 请提供base_login.html 中放置{% block javascript %} 的部分。
    • 将其添加到我原来的问题中,尽管我将{% block javascript %} 放在了 form_template.html 中。抱歉,我看错了您帖子中的最后一句话。
    猜你喜欢
    • 2014-06-28
    • 2013-02-14
    • 2020-02-16
    • 1970-01-01
    • 1970-01-01
    • 2022-07-07
    • 2022-10-15
    • 1970-01-01
    • 2011-01-14
    相关资源
    最近更新 更多