2

私はDjango(およびWeb開発)にかなり慣れていないので、この問題に苦労しています。javascriptを使用して単純なタイマーを作成し、タイマーが起動すると更新される変数をモデルに含めたいと考えています。私はそれをする方法に迷っています。

これが私のコードです:

home.html

<button onclick='activatecount()' value='countdown'>Start Timer</button>
<p id='countdown'></p>
<p id='endofcount'></p>

<script src='{{ STATIC_URL }}timerapp.js'></script>
</body>
</html>

次に、javascript。画面にボタンがあり、ユーザーがボタンをクリックするとタイマーがカウントダウンを開始します。

var myTime = setInterval(displayTime, 1000);//Calls the function displayTime once every second
function subtractSeconds(){
seconds--;
document.getElementById('countdown').innerHTML = seconds; }

var interval;
var minutes = 2;
var seconds = 10;

function activatecount(){
    countdown('countdown');
}

function countdown(element) {
    interval = setInterval(function() {
        var el = document.getElementById(element); 
        if(seconds == 0) { 
            if(minutes == 0) {
                el.innerHTML = "countdown's over!";  
                clearInterval(interval); 
                return;
            } else { 
                minutes--;
                seconds = 60;
            }
        } 
        if(minutes > 0) { 
            var minute_text = minutes + (minutes > 1 ? ' minutes' : ' minute');
        } else {
            var minute_text = '';
        }
        var second_text = seconds > 1 ? 'seconds' : 'second';
        el.innerHTML = minute_text + ' ' + seconds + ' ' + second_text + ' remaining';
        seconds--; 
        }, 1000); 
}

私のviews.py

def home(request):
    return render_to_response('home.html', context_instance=RequestContext(request))

そして最後に私のmodels.py

class User(models.Model):
    username = models.CharField(max_length=10)
    email = models.EmailField(max_length=254)
    first_name = models.CharField(max_length = 20)
    last_name = models.CharField(max_length = 20)
    join_date = models.DateField().auto_now_add
    block_count = models.IntegerField()

def __unicode__(self):
    return self.username

タイマーが切れたときにblock_countを1つインクリメントするだけです。(後でさらに機能を追加しますが、この一見些細なことで完全に失われます。)フォームとPOSTを使用してデータベースにデータを送信する方法についての議論しか見つかりませんが、ここではフォームを使用していません。 。

ここでPOSTを使用する必要がありますか?もしそうなら、どのように?

4

2 に答える 2

1

モデルを更新する 2 番目のビューを作成します。.ajaxデータベースの更新中に同じページに留まりたい場合は、jquery のメソッドを使用して 2 番目のビューを呼び出します。

何かのようなもの:

ビュー.py

def ajax(request):
    if request.is_ajax():
    // add 1 to your block count

jquery:

function countdown(element) {
interval = setInterval(function() {
    var el = document.getElementById(element); 
    if(seconds == 0) { 
        if(minutes == 0) {
            el.innerHTML = "countdown's over!";  
              $.ajax({
                type:"POST",
                url :"/ajax-url/",
                error:function(data){alert('Error');}
                success:function(data{alert('OK!');}
                });
            clearInterval(interval); 
            return;
            // etc etc

URL:

url(r'^ajax-url/$', 'views.ajax'),

これが一般的な考え方です。私はこのコードをテストしていませんが、問題を解決する方法を理解するための出発点となるはずです。

于 2012-11-26T08:46:09.347 に答える
0

このようなフォームを作成できます

<form name="myform" action="/update-model/ method="post">
<input type="hidden" name="update" value="yes">
</form>

とこのようなビュー

def update_model(request):
    if request.POST:
        if request.POST['update']:
            #do your code here.

そしてあなたのJavaScriptはこのように

    if(minutes == 0) {
            el.innerHTML = "countdown's over!";  
            document.myform.submit();
            clearInterval(interval); 
            return;
        } else { 
            minutes--;
            seconds = 60;
        }

Django(および一般的なWebアプリ)では、サーバーに何かを実行する必要がある場合、サーバーにHTTPリクエストを送信します。これは、メソッドをURL(urls.py)にマッピングすることで実現されます。その後、1.5で非推奨にすることができます

url = "{% url my_url_name %}"

Webブラウザー(WebアプリのGUIでしょ?)を使用してその要求を送信する方法について、いくつかの選択肢があります。

  • 非同期
  • 同期的に

リクエストを同期的に送信するには、標準のページロードが必要です。Googleのホームページフォームは同期しています。これは、リクエストでユーザーを別のページに移動する必要がある場合、または送信後にアプリを再起動する必要がある場合にいつでも実行できます。これは、フォームの送信とリンクを使用して行います。

リクエストを非同期で送信すると、ページの一部をさまざまな時間にロード(リロード)でき、サーバーで処理できるためです。Googleの検索結果ページから再度検索すると、検索結果が非同期的に取得されます。これは、ajaxと呼ばれる手法を使用して行います。

于 2012-11-27T16:49:56.390 に答える