我有一个使用MPTT包的django项目(相当简单),通过它我为特定模型创建类别。我正在创建一个基于MPTT的菜单系统,但是我发现自己在自己的视图中重复了我的代码,更具体地说:
def index(request):
menu = MyCategory.objects.all()
def viewitem(request, item_slug):
menu = MyCategory.objects.all()
是否应该将其重构为模板标签?我应该做一个助手功能吗?还是创建将对象传递给模板的中间件上下文?根据Django逻辑,哪种方法最好?从示例中非常简单,我仅返回一个mptt现有标签要使用的查询集:
{% if menu.exists %}
<nav id="topnavigation">
<ul>
{% spaceless %}
{% recursetree menu %}
<li>
<a href="{% url 'view-category' node.slug %}">{{ node.title }}</a>
{% if not node.is_leaf_node %}
<ul class="submenu">
{{ children }}
</ul>
{% endif %}
</li>
{% endrecursetree %}
{% endspaceless %}
</ul>
</nav>
{% endif %}
Django的方法是使用基于类的视图并创建自定义的Mixin来包含重复的代码。因此,Mixin可能如下所示:
class MenuContextMixin(object):
def get_context_data(self, **kwargs):
context = super(MenuContextMixin, self).get_context_data(**kwargs)
context['menu'] = MyCategory.objects.all()
return context
其用法如下:
class IndexView(MenuContextMixin, TemplateView):
template_name = "index.html"
由于您使用的是基于函数的视图,因此我认为最好的解决方案是编写一个辅助函数来扩展上下文。例如views.py:
def get_extra_context():
return {
'menu': MyCategory.objects.all(),
}
def index(request):
...
context.update(get_extra_context())
return render_to_response('index.html', context)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句