Mat*_*ick 4 python django caching django-templates
我是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)
Run Code Online (Sandbox Code Playgroud)
和模板:
{% 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 %}
Run Code Online (Sandbox Code Playgroud)
某些页面将包含对象的错误信息.以下是我获得的示例源代码:
<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>
Run Code Online (Sandbox Code Playgroud)
第二个投票href应该是"/ rate/vote/17/16"并且标志href应该是"/ rate/flag/17"但是出现问题并且我得到的数据不一致.
有任何想法吗?
在我的一些代码中看一下这个,我在我的模板中有这个:
{{ mytable.0.pk }}
{{ mytable.1.pk }}
{{ mytable.0.pk }}
{{ mytable.3.pk }}
Run Code Online (Sandbox Code Playgroud)
我得到这个输出:
91596
54774
156800
23593
Run Code Online (Sandbox Code Playgroud)
奇怪,直到你认为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
Run Code Online (Sandbox Code Playgroud)
每次使用点表示法时,它都会执行一个完整的新查询.我建议像这样修改你的代码:
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)
Run Code Online (Sandbox Code Playgroud)
因为list()正在强制进行评估,所以它将在那时执行查询.此外,这两个项目的数据已经缓存,因此没有理由再次访问数据库.你应该好好去.
| 归档时间: |
|
| 查看次数: |
3456 次 |
| 最近记录: |