除非重新启动服务器,否则我从管理界面对数据库所做的更改不会反射(reflect)出来。
这是我的 models.py 文件 -
class InventoryManager(models.Manager):
def getActiveId(self):
return self.filter(currentlyActive=True)
....
....
class Inventory(models.Model):
....
....
....
name = models.CharField(_("item name"),max_length=30)
category = models.CharField(_("breakfast/lunch/dinner"), max_length=2,choices=TIME_OF_SERVICE, default="lunch")
foodType = models.CharField(_("veg/non-veg"), max_length=7,choices=TYPE_OF_FOOD, default="veg")
stock = models.IntegerField(_("stock quantity"))
image = models.ImageField(_("food item photo"),upload_to='images/',null=True)
currentlyActive = models.BooleanField(_("active/inactive for the day"),default=0)
description = models.CharField(_("food item description"),max_length=150)
objects = InventoryManager()
def __str__(self):
return self.name
....
....
在这里,我过滤掉数据库中 currentlyActive
为 True
的条目。
现在,在我的 views.py
文件中:
def getActiveItems():
idList = []
query = Inventory.objects.getActiveId().values()
for i in query:
idList.append(i['id'])
return idList
def menu(request,Id):
photos = []
menu = []
for i in xrange(len(Id)):
photos.append(str(Inventory.objects.values().get(id=Id[i])['image']))
menu.append(str(Inventory.objects.values().get(id=Id[i])['name']))
print menu
context={'imageList': zip(photos,menu)}
return render(request,'menu.html', context)
urls.py
文件-
....
....
urlpatterns = patterns('',
url(r'^$', menu, {'Id' : getActiveItems()}),
url(r'^admin/', include(admin.site.urls)),
) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
最后,menu.html
模板文件-
....
....
{% block content %}
{% for image,menu in imageList %}
<div style = "display:block">
<img src="{{ MEDIA_URL }}{{ image }}">
<p>{{ menu }}</p>
</div>
{% endfor %}
{% endblock %}
现在,在menu
函数中,我使用了print menu
语句来打印数据库中currentlyActive
的项目。
当我更改数据库中的 currentActive bool 值然后加载页面时,打印菜单
显示正确的值。
(例如,当数据库中的第 2 个、第 3 个和第 4 个条目的 currentActive 设置为 True 时,打印菜单显示 [2,3,4]
。当我将第 5 个条目的 currentActive 设置为 True 时,然后加载主页,它确实显示了[2,3,4,5]
)。
所以,我在渲染模板或调用菜单函数时发现了问题所在。
当终止本地服务器并再次重新启动时,更改会完美地反射(reflect)在渲染的模板中。
无法弄清楚为什么会发生这种情况。
最佳答案
问题既不是在渲染模板时,也不是在调用函数时,问题出在 url 定义中。
urls.py 仅在服务器首次启动时评估一次。所以当你写:
url(r'^$', menu, {'Id' : getActiveItems()}),
getActiveItems 将被评估,并且永远不会再次被调用(直到您重新启动服务器)。
您应该从 View 内部调用它,而不是从 urls.py 调用 getActiveItems 并将其结果传递到菜单 View 。
url.py
....
urlpatterns = patterns('',
url(r'^$', menu),
url(r'^admin/', include(admin.site.urls)),
) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
View .py
...
def menu(request):
Id = getActiveItems()
photos = []
menu = []
...
如果您打算从其他地方调用带有 Id 参数的 View ,请将其设置为非强制,并且仅在参数为 null 时调用 getActiveItems
关于python - Django-对 admin 所做的更改不会在不重新启动服务器的情况下反射(reflect)在模板中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28778586/