1

アクションを実行するためにさまざまな URL にリンクするメイン ページがある Django アプリを構築しています (たとえば、データベースにレコードを追加するためのリンクがあります)。これはテンプレートのフォームを使用して行われ、現在の URL が app/index から app/add に変更されます。問題は、そのアクションを管理するスクリプトで render_to_response を使用すると、URL は変更されませんが、使用されている html がインデックス ページに戻されることです。したがって、アプリでリンクを使用するとこれは機能しますが、ユーザーがいずれかの時点でそれらのページのいずれかを更新しようとすると、アクションが再度実行される可能性があります (つまり、アプリを更新/追加すると、そのレコードが再度追加されます)。HttpResponseRedirect またはリダイレクトを使用しますが、jobList を含むコンテキストを渡す必要があります (render_to_response を使用する場合は以下を参照)。私の現在の修正は、すべてのアクションをインデックス ページのスクリプトにまとめて、すべてのアクション ボタンをそこにリダイレクトし、オプションを送信することですが、これはプログラムを構築する方法としてはひどいものであり、もっと良い方法があるはずです。これ。これが多すぎるテキストでないことを願っています。参考までに、関連するファイルをいくつか示します。助けてくれてありがとう。

urls.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'),
)

views.py (一部のみ、画面を乱雑にしたくない)

#This script is responsible for whatever operations need to happen before viewing the index page again and then displaying the index page
#This includes:
#user authentication
#adding entries to the database
def detail(request):
    if request.user.is_authenticated():
        if 'isAdding' in request.POST:
            #Add data to database
            job = Job()
            job.name = request.POST['name']
            job.user = request.POST['user']
            job.command = request.POST['command']
            job.ipRange = request.POST['ipRange']
            job.whenToRun = str(request.POST['dateToRun']) + ' ' + str(request.POST['timeToRun'])
            job.save()
        elif 'isChanging' in request.POST:
            #Change selected data in database
            job = Job()
            job.name = request.POST['name']
            job.user = request.POST['user']
            job.command = request.POST['command']
            job.ipRange = request.POST['ipRange']
            job.whenToRun = str(request.POST['dateToRun']) + ' ' + str(request.POST['timeToRun'])
            job.save()
        jobList = Job.objects.all()
        return render_to_response('Minion/detail.html', {'jobList': jobList}, context_instance=RequestContext(request))
    else: #need to authenticate user
        if request.method == 'POST':
            username = request.POST['username']
            password = request.POST['password']
            user = authenticate(username=username, password=password)
            if user is not None:
                if user.is_active:
                    login(request, user)
                    jobList = Job.objects.all()
                    return render_to_response('Minion/detail.html', {'jobList': jobList}, context_instance=RequestContext(request))
                else:
                    return render_to_response('Minion/home.html', {'loginFail': True}, context_instance=RequestContext(request))
            else:
                return render_to_response('Minion/home.html', {'loginFail': True})
        else:
            return render_to_response('Minion/home.html', {'improperURL': True}, context_instance=RequestContext(request))

detail.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>

add.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>
4

0 に答える 0