用良好的方式在django应用程序中重定向url

2024-04-25 17:12:26 发布

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

我正在构建一个Django应用程序,其中有一个主页链接到不同的url来执行操作(例如,有一个链接可以向数据库添加记录)。这是使用模板中的表单完成的,并将当前URL从app/index更改为app/add。问题是,当我在管理该操作的脚本中使用render_to_响应时,它不会更改URL,但会将使用的html改回索引页。因此,如果你使用应用程序中的链接,但如果用户在任何时候尝试刷新其中一个页面,它可能会再次执行该操作(即,如果你刷新app/add,它将再次添加该记录)。我将使用HttpResponseRedirect或redirect,但我需要传递一个包含jobList的上下文(在我使用render_to_响应的地方请参见下面)。我目前的解决方法是把所有的操作都放在索引页的脚本中,然后让所有的操作按钮重定向到它,并提交选项,但这是一个糟糕的方式来构建一个程序,我觉得肯定有更好的方法来做到这一点。希望这不是太多的文字。作为参考,这里有一些相关的文件。提前谢谢你的帮助。在

在网址.py在

from django.conf.urls import patterns, include, url
from django.views.generic import DetailView, ListView
from django.conf.urls.defaults import *
from Minion.models import Job

urlpatterns = patterns('Minion.views',
    # URLs for the MinionUI app
    url(r'^$', 'home'),
    url(r'^index/$', 'detail'),
    url(r'^add/$', 'add'),
    url(r'^output/$', 'output'),
    url(r'^change/$', 'change'),
    url(r'^cal/$', 'calendarTest'),
    url(r'^delete/$', 'delete'),
    url(r'^change/$', 'change'),
)

在视图.py(只有部分内容,不想让屏幕太乱)

^{pr2}$

在详细信息.html(主索引模板)

{% load i18n %}
<head>
    <!script src="//ajax.googleapis.com/ajax/libs/jquery/jquery.min.js" />
    <script type="text/javascript">

        //These two function are used to change where we direct our POST data to
        function determineWhereToGo(){
            try{
                var element = document.getElementById('dropdown');
                var selected = element.options[element.selectedIndex].text;
                if(selected === "Delete"){
                    document.getElementById('checkboxes').action = "{% url 'Minion.views.delete' %}";
                }else if(selected === "Change"){
                    document.getElementById('checkboxes').action = "{% url 'Minion.views.change' %}";
                }
            }catch(err){
                alert("Javascript Error\n" + err.message);
            }
        }
    </script>
</head>
<table border="2">
    <tr>
        <th />
        <th>Job ID</th>
        <th>Name</th>
        <th>User</th>
        <th>Command</th>
        <th>IP Range</th>
        <th>Date to Run</th>
    </tr>
    <form id="checkboxes" method="post" action="{%url 'Minion.views.detail' %}">
        {% csrf_token %}
        {% for job in jobList %}
            <tr>
                <td><input type="checkbox" name="{{ job.id }}Selection"/></td>
                <td>{{ job.id }}</td>
                <td>{{ job.name }}</td>
                <td>{{ job.user }}</td>
                <td>{{ job.command }}</td>
                <td>{{ job.ipRange }}</td>
                <td>{{ job.whenToRun }}</td>
            </tr>
        {% endfor %}
        <select id="dropdown" onchange="determineWhereToGo();">
            <option />
            <option value="Delete">Delete</option>
            <option value="Change">Change</option>
        </select>
        <input type="submit" value="Go" />
    </form>
    <form method="post" action="{% url 'Minion.views.add' %}">
        {% csrf_token %}
        <input type="submit" value="Add" />
    </form>
</table>

在添加.html(这是一个使用isAdding选项作为参考的模板)

{% load i18n %}

<h1>Add a Job</h1>
<hr width="18%" size="3" align="left" />
<form method="post" action="{% url 'Minion.views.detail' %}">
{% csrf_token %}
    Name<input type="text" name="name" /><br /><br />
    User<input type="text" name="user" /><br /><br />
    Command<input type="text" name="command" /><br /><br />
    IP Range<input type="text" name="ipRange" /><br /><br />
    Date to Run<input type="date" name="dateToRun" value="YYYY-MM-DD" /><br /><br />
    Time to Run<input type="time" name="timeToRun" value="HH:MM:SS" /><br /><br />
    <input type="hidden" name="isAdding" value="True" />
    <input type="submit" value="Add Job" />
</form>

Tags: totextnamebrformurlinputvalue