Django保存创建两个记录而不是一个

时间:2016-08-21 14:58:47

标签: python mysql django

Django正在MySQL中创建两条记录而不是一条记录。

我通过链接调用函数

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

功能本身非常直接。我通过request.get获取变量,创建一个新对象,最后保存它。但是,当我检查数据库时,有两条记录,而不仅仅是一条记录。

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

由于

2 个答案:

答案 0 :(得分:1)

您应该避免在GET请求上修改数据库。各种各样的事情可能会导致重复请求 - 例如,资产或图标的请求被相同的URL模式捕获并路由到同一视图 - 所以在数据库中添加条目之前,您应始终需要POST。

答案 1 :(得分:1)

您使用的是谷歌浏览器吗?如果是,那么Google Chrome就会延迟加载。因此,如果您要在Google Chrome中输入网址,它会尝试在后台加载网站,如果您点按“输入”,则会再次获取此网址。当你试图通过一个链接来修复锚时也是如此。这是一个边缘案例,但它发生了。尝试使用firefox或禁用该功能。