Django从模板导入模型

时间:2014-08-13 20:13:45

标签: django django-models extends django-templates django-database

在我的django项目中,我有一个base.html,我的所有模板{%extends' base.html' %}。在该基本模板中,我想将此作为我所有算法的列表。

{% for algorithm in algorithms %}
   # list them out as links in nav bar
{% endfor %}

但是我没有将算法传递到基础,因为它只是扩展其他模板。

我不知道如何解决这个问题。我的想法是在基本模板中使用{%load%},基本上就是这样。

from algorithms.models import Algorithm
from django import template


register = template.Library()

def GetAlgorithmObjects():

  a = Algorithm.objects.all()

  return {'algorithms': a}

我不确定负载是如何工作的,这可以解释这种失败。你将如何实际实现这一点,或者我应该走另一条道路。

2 个答案:

答案 0 :(得分:1)

您实际上想要创建一个上下文处理器来为所有模板提供算法对象。 context_processors只是返回在任何视图中用作上下文的对象的函数。所以这是您需要的代码:

对于此示例,我的应用程序名为core。我在应用程序中有一个名为context_processors的python文件,函数为myuser。这是我的功能代码:

from django.contrib.auth.models import User
from .models import MyUser

def myuser(request):
    try:
        user = User.objects.get(pk=request.user.pk)
    except User.DoesNotExist:
        user = None

    if user:
        myuser = MyUser.objects.get(user=user)
        return {'myuser': myuser}
    else:
        # load a default user for testing
        myuser = MyUser.objects.all()[0]
        return {'myuser': myuser}

myuser()函数只返回我的扩展用户模型。我创建了这个,所以我可以在所有模板中使用MyUser对象。

然后将此context_processor添加到settings.py

settings.py

TEMPLATE_CONTEXT_PROCESSORS = (
    # other default context processors
    'core.context_processors.myuser',
    )

答案 1 :(得分:1)

您可以使用包含标记https://docs.djangoproject.com/en/dev/howto/custom-template-tags/#inclusion-tags

进行制作

在您的应用algorithms创建目录templatetags并在其中放入一个名为algorithms_tags.py的文件(当然在此目录中必须有一个名为__init__.py的文件)

然后该文件的内容与您所写的内容类似:

from algorithms.models import Algorithm
from django import template

register = template.Library()

@register.inclusion_tag('algorithms/show_algorithms.html')
def show_algorithms():
    a = Algorithm.objects.all()
    return {'algorithms': a}

然后,您需要一个位于algorithms/templates/algorithms/show_algorithms.html的模板,其中包含以下内容:

{% for algorithm in algorithms %}
   # list them out as links in nav bar
{% endfor %}

您可以在base.html中使用它,如下所示:

{% load algorithms_tags %}

{% show_algorithms %}

一些解释:

  • {% load algorithms_tags %}中,“algorithms_tags”是.py目录中创建的templatetags文件的名称(不带扩展名)
  • {% show_algorithms %}中,“show_algorithms”是register.inclusion_tag
  • inclusion_tag.py修饰的函数的名称