2009-11-16 43 views
4

我是Django的新手,试图在两幅图像之间实现投票系统。但是,它看起来像是页面被缓存或什么,因为当我刷新它时,一些值是错误的。我的设置中没有缓存设置。Django是否自动缓存模板?

这里查看:

def rate(request, type): 
    photos = Photo.objects.order_by('?')[:2] 
    c = Context({"photos": photos, "type": type}) 
    return render_to_response("base_rate.html", c) 

和模板:

{% extends "base.html" %} 

{% block body %} 
<div class="photo"> 
    <img src="{{photos.0.photo.url}}" alt="Photo" /> 
    <a href="/rate/vote/{{photos.0.id}}/{{photos.1.id}}" class="vote">Vote</a> 
    <a href="/rate/flag/{{photos.0.id}}" class="flag">Flag</a> 
</div> 

<div class="photo"> 
    <img src="{{photos.1.photo.url}}" alt="Photo" /> 
    <a href="/rate/vote/{{photos.1.id}}/{{photos.0.id}}" class="vote">Vote</a> 
    <a href="/rate/flag/{{photos.1.id}}" class="flag">Flag</a> 
</div> 
{% endblock %} 

有些将包含的对象错误信息。下面是我得到一个例子源:

<div class="photo"> 
    <img src="/img/rate/16photo1.jpg" alt="Photo" /> 
    <a href="/rate/vote/16/17" class="vote">Vote</a> 
    <a href="/rate/flag/16" class="flag">Flag</a> 
</div> 
<div class="photo"> 
    <img src="/img/rate/17photo2.jpg" alt="Photo" /> 
    <a href="/rate/vote/16/16" class="vote">Vote</a> 
    <a href="/rate/flag/16" class="flag">Flag</a> 
</div> 

第二次表决的href应该是“/速度/票/ 17/16”和标志HREF应该是“/速度/标记/ 17”,但东西出错了,我收到了不一致的数据。

任何想法?

+3

对于src和href,使用get_absolute_url或命名的url模式会更好 - 稍后会为您节省很多麻烦 - 请查看{%url%}模板标记和.get_absolute_url约定 – Evgeny

回答

8

以在我的一些代码,看看这个,我有这个在我的模板:

{{ mytable.0.pk }} 
{{ mytable.1.pk }} 
{{ mytable.0.pk }} 
{{ mytable.3.pk }} 

而且我得到这样的输出:

91596 
54774 
156800 
23593 

奇,直到你认为Django的执行数据库查询非常懒得去做。这是我的mysql日志中显示的一个页面加载:

SELECT `mytable`.`id` FROM `mytable` ORDER BY RAND() LIMIT 1 
SELECT `mytable`.`id` FROM `mytable` ORDER BY RAND() LIMIT 1 OFFSET 1 
SELECT `mytable`.`id` FROM `mytable` ORDER BY RAND() LIMIT 1 
SELECT `mytable`.`id` FROM `mytable` ORDER BY RAND() LIMIT 1 OFFSET 3 

每次使用点符号时,它正在执行一个完整的新的查询。我建议修改,像这样的代码:

def rate(request, type): 
    photos = list(Photo.objects.order_by('?')[:2]) 
    c = Context({"photos": photos, "type": type}) 
    return render_to_response("base_rate.html", c) 

因为list()迫使评估,它会执行查询,然后有。另外,这两个项目的数据已经被缓存了,所以没有理由再次击中数据库。你应该很好走。

+0

哇!谢谢杰克。我不认为我会想到这一点。 –

+1

我有mysql在任何时候使用ORM进行完整的查询日志。它有助于找到那些隐藏在其中大部分的小“陷阱”。这也是一个开始优化的好方法(“嘿,为什么这一页执行100个查询!?”)。 –

+1

另一个选项是使用'{%with%}'模板标签强制评估您的查询。有时这比在视图中强制它更方便。 –

1

order_by('?')意味着该列表中随机为了有序的,所以{{ photos.0 }}会在每次加载页面的不同。

另外:

<a href="/rate/vote/{{photos.1.id}}/{{photos.0.id}}" class="vote">Vote</a> 
          ^^^    ^^^ 

看起来这可能是不正确的。

+0

是的,我我意味着要这样做。我想获得两张随机照片进行比较。 href代码是可以的。第一个变量是获胜照片的ID,第二个变量是丢失照片的ID。 –

+0

这并不能解释为什么'id'在同一页的第二部分不同。 –

1

Django默认不会缓存这些类型的东西。确保你的浏览器/ isp/etc。没有缓存它。

它看起来像你的数据库查询没有返回你所期望的。如果必须,直接通过调试器或打印语句调试进行检查。

这就是说,你真的需要长时间思考你的应用程序设计。使用GET请求对您的应用程序进行有状态更改是一个非常糟糕的主意。尤其是你这样做的方式。您需要将这些链接更改为POST请求。否则,你会发现随机的网络蜘蛛破坏你的应用程序。

+0

谢谢保罗。你对GET/POST是正确的。我现在应该知道,但我现在还是会忘记。 –