更新DOM而不重新加载Django中的页面

Sta*_*ute 5 python django

我在DOM中有两个选择列表,第一个选择列表是在视图的方法加载页面时在URL加载期间填充的。第二个选择列表的内容取决于用户在第一个选择列表中选择的内容。当用户在第一个选择列表中进行选择,在python中进行一些操作,返回要在第二个选择列表中显示的vallues列表,然后在不刷新页面的情况下填充它时,如何将python方法绑定到事件?

我的模板如下所示:

{% block content %}

{% if list_of_events %}
    <form>
        <select>
            {% for event in list_of_events %}
                <option value="name">{{ event.module }}</option>
            {% endfor %}
        </select>
    </form>

{% else %}
    <p>No events available now.</p>
{% endif %}
Run Code Online (Sandbox Code Playgroud)

下一个条件是等待first_selection参数,该参数应在用户在第一个选择列表中选择一个值后返回给模板。

{% if first_selection %}
    <form>
        <select>
            {% for room in list_of_rooms %}
                <option value="name">{{ room.id }}</option>
            {% endfor %}
        </select>
    </form>
{% endif %}

<input type="submit" value="Submit">

{% endblock %}
Run Code Online (Sandbox Code Playgroud)

我的views.py方法如下所示:

def events(request):
try:
    list_of_events = Event.objects.all()
except:
    raise Http404('Something\'s wrong with events page loader')
return render(request, 'web_service/schedule.html', {
    'list_of_events': list_of_events

})
Run Code Online (Sandbox Code Playgroud)

Sta*_*ute 5

在Django中(至少到目前为止),没有直接方法可以直接从模板(html)动态调用python方法而不刷新页面。

要调用python方法并在模板中看到它的效果,而无需刷新页面JS。它不像在OOP中那样简单地调用实例方法,但并不像看起来那样难。

下面的示例演示了如何响应按钮click并将一些数据发送到django view,然后将结果返回模板而不进行刷新DOM

从模板调用python代码的唯一方式与我们所涉及的方式相同url,这意味着我们必须创建new url pattern。然后调用必要的view,并将响应返回给模板JsonResponse

注意:请确保jquery<body>标签的内部底部导入。

首先,我们需要创建响应器,该响应器将处理按钮单击并创建AJAX对连接到的url的请求view。作为参数AJAX request传递input给我们的url模式,这意味着此参数将传递给django view。如果从我们的调用返回了一些信息,view那么数据将被success封闭解压缩。

假设我们的模板如下所示:

<input type="text" id="user-input" autofocus=""><br>
<button type="button" id="sender">Send data</button><br>
<p id="p-text">foo bar</p>
Run Code Online (Sandbox Code Playgroud)

脚本处理的点击和请求如下所示:

<script>

$("#sender").click(function () {
    var input = $('#user-input').val();

    $.ajax({
        url: '{% url 'get_response' %}',
        data: {
          'inputValue': input
        },
        dataType: 'json',
        success: function (data) {
          document.getElementById('p-text').innerHTML = data["respond"];
        }
      });
    });

</script>
Run Code Online (Sandbox Code Playgroud)

urls.py需要新的模式:

urlpatterns = [
    ...
    url(r'^ajax/get_response/$', views.answer_me, name='get_response')
    ...
]
Run Code Online (Sandbox Code Playgroud)

注:ajax/URL和URL模式本身的路径的一部分,对这个电话是如何处理没有影响。可以是您想要的任何内容,例如:^foo/bar/$

最后一步是添加响应的Django view。这个简单的示例返回带有一些附加文本的输入,但是通常在这里您可以调用其他python方法并执行所需的任何操作:

def answer_me(request):
    field = request.GET.get('inputValue')
    answer = 'You typed: ' + field

    data = {
        'respond': answer
            }
    return JsonResponse(data)
Run Code Online (Sandbox Code Playgroud)