对管理员进行的Django更改不会在不重新启动服务器的情况下反映在模板中

时间:2015-02-28 05:46:52

标签: python django django-templates django-views

除非我重新启动服务器,否则不会反映我从管理界面对数据库所做的更改。

这是我的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布尔值然后加载页面时,print menu会显示正确的值。 (例如,当db中的第2,第3和第4个条目将currentActive设置为True时,打印菜单会显示[2,3,4]。当我将第5个条目的currentActive设置为True然后加载主页时,它确实显示了我[2,3,4,5])。

所以,我在渲染模板或调用菜单功能时想出了问题所在。

当杀死本地服务器并再次重新启动时,更改将完美地反映在呈现的模板中。

无法弄清楚为什么会这样。

1 个答案:

答案 0 :(得分:1)

问题不在于渲染模板或调用函数时,问题出在url定义中。

仅在首次启动服务器时评估urls.py一次。所以当你写:

url(r'^$', menu, {'Id' : getActiveItems()}),

然后评估getActiveItems并且永远不会再次调用(直到重新启动服务器)。

您应该从视图中调用它,而不是从urls.py调用getActiveItems并将其结果传递给菜单视图。

urls.py

....
urlpatterns = patterns('',
    url(r'^$', menu),
    url(r'^admin/', include(admin.site.urls)),
) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

views.py

...
def menu(request):
    Id = getActiveItems()
    photos = []
    menu = []
    ...

如果您打算使用其他地方的Id参数调用视图,请将其设置为非强制性,如果参数为null,则仅调用getActiveItems