2016-08-21 65 views
0

Django在MySQL中創建兩條記錄,而不是一條記錄。Django保存創建兩條記錄而不是一條

我通過一個鏈接

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

函數本身是非常簡單的調用一個函數。我通過request.get獲取變量,創建一個新對象,最後保存它。但是,當我檢查DB時,有兩條記錄,而不僅僅是一條。

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) 

任何幫助和方向,將不勝感激。

解決方案根據回答

<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, 
    }) 

感謝

+0

您可以在def markpresent(任何打印消息)中添加調試打印嗎?查看在runserver的控制檯中打印了多少次 –

+0

我通過遠程服務器上的乘客運行此操作,因此runserver實際上不是此處的選項。任何有關當前環境中的故障​​排除建議將不勝感激,但與設置,我不能使用runserver。 – PerryDaPlatypus

回答

1

你應該避免在一個GET請求修改數據庫。各種各樣的事情可能會導致重複的請求 - 例如,請求資源或收藏夾圖標被相同的URL模式捕獲並路由到相同的視圖 - 所以您應該在添加數據庫條目之前始終需要POST。

+0

這很有道理。由於我根據對db的​​查詢動態生成客戶端列表,因此我在獲取請求上得到了解決。我想我可能不得不在這裏使用Post,但是我必須處理頁面上的多個提交按鈕。 – PerryDaPlatypus

1

您使用的是谷歌瀏覽器嗎?如果是,那麼谷歌瀏覽器就像懶加載一樣。因此,如果您要在Google Chrome中輸入網址,它會嘗試在幕後加載網站,如果您點擊輸入,則會再次獲取該網址。當你試圖通過鏈接去錨時,情況也是如此。這是一個邊緣案例,但它發生了。嘗試使用Firefox或禁用該功能。

+0

使用firefox,但這也突出了基於瀏覽器不一致性的方法中的潛在缺陷。顯然,希望應用程序能夠與所有瀏覽器一起工作(儘可能多)。 – PerryDaPlatypus

+0

@PerryDaPlatypus當然,所以Daniel Rosemann寫道,推薦選項是使用POST進行創建。 – turkus

相關問題