2016-08-21 14 views
0

DjangoはMySQLでは2つのレコードを1つではなく作成しています。Django 1つではなく2つのレコードを作成する

私は、関数自体は非常に単純です

<a href="{% url 'markpresent' id=c.id %}"><button class="btn btn-primary">Thats Me!</button></a> 

リンクを介して関数を呼び出します。変数をrequest.getで取得し、新しいオブジェクトを作成して最後に保存します。しかし、私はDBをチェックすると、1つではなく、2つのレコードがあります。

def markpresent(request, id): 
    new_attendance = attendance(clientid_id = id, date = datetime.datetime.now(), camp = 3) 
    new_attendance.save() 
    return render(request, 'clienttracker/markpresent.html', { 
     'client': id, 
    }) 

モデル

class attendance(models.Model): 
    clientid = models.ForeignKey(newclients, on_delete=models.CASCADE) 
    date = models.DateField() 
    camp = models.CharField(max_length = 3, default=0) 

すべてのヘルプや方向をいただければ幸いです。 ANSWERS

<form action="{% url 'markpresent' %}" method="post"> 
{% csrf_token %} 
<button type="submit" name="client" value="{{ c.id }}" class="btn btn-primary">Thats Me!</button> 
</form> 

def markpresent(request): 
    id = request.POST.get('client') 
    new_attendance = attendance(clientid_id = id, date = datetime.datetime.now(), camp = 3) 
    new_attendance.save() 
    return render(request, 'clienttracker/markpresent.html', { 
     'client': id, 
    }) 

に基づく

SOLUTIONあなたがGET要求にデータベースを変更することは避けてくださいおかげ

+0

def markpresent(任意の印刷メッセージ)にデバッグプリントを追加できますか? runserverのコンソールで何回印刷されているのかを確認してください –

+0

私はリモートサーバ上の乗客経由でこれを実行していますので、runserverは実際にはオプションではありません。現在の環境でのトラブルシューティングに関する提案はありがたいですが、セットアップではrunserverを使用できません。 – PerryDaPlatypus

答えて

1

。例えば、アセットやファビコンが同じURLパターンでキャッチされ、同じビューにルーティングされるなど、重複した要求が発生する可能性があるため、データベースにエントリを追加する前に必ずPOSTを行う必要があります。

+0

意味があります。 dbへのクエリーに基づいてクライアントのリストを動的に生成しているので、私は取得要求に落ち着いています。私はここでPostを使う必要があるかもしれないと思うが、私はそのページの複数のsubmitボタンを扱わなければならないだろう。 – PerryDaPlatypus

1

Google Chromeをお使いですか?はいの場合、Google Chromeには遅延読み込みのようなものがあります。そのため、Google ChromeにURLを入力すると、サイトの背後にサイトが読み込まれ、enterをタップすると、このURLが再び表示されます。同じことは、アンカーにリンクを張ろうとしているときです。それは最悪の場合ですが、それは起こります。 firefoxで試してみるか、その機能を無効にしてください。

+0

Firefoxを使用していますが、これはブラウザの不一致に基づくアプローチの潜在的な欠陥を強調しています。明らかに、アプリがすべてのブラウザで動作するようにしてください(可能な限り)。 – PerryDaPlatypus

+0

@PerryDaPlatypus Daniel Rosemannが書いたように、推奨オプションは作成のためにPOSTを使うことです。 – turkus

関連する問題