【问题标题】:Django-changes made to admin are not reflected in the template without restarting the server在不重新启动服务器的情况下,对 admin 所做的 Django 更改不会反映在模板中
【发布时间】:2015-02-28 05:46:52
【问题描述】:

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

这是我的 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
....
....

在这里,我将过滤掉数据库中具有currentlyActiveTrue 的条目。

现在,在我的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 向我显示了正确的值。 (例如,当数据库中的第 2、第 3 和第 4 个条目的 currentActive 设置为 True 时,打印菜单向我显示 [2,3,4]。当我将第 5 个条目的 currentActive 设置为 True 然后加载主页时,它确实向我显示 @987654335 @)。

所以,我在渲染模板或调用菜单函数时发现了问题。

当杀死本地服务器并重新启动它时,所做的更改会完美地反映在渲染的模板中。

不知道为什么会这样。

【问题讨论】:

    标签: python django django-templates django-views


    【解决方案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

    【讨论】:

    • 工作就像一个魅力。太感谢了 :-) 。你不知道你帮我解决了多少麻烦。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-25
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    • 2020-04-04
    • 2012-10-03
    相关资源
    最近更新 更多