如何在另一个应用程序中使用一个应用程序中的模板

时间:2019-02-17 06:28:19

标签: django django-templates

当前正在尝试进行社交应用。我创建了两个应用程序Main和Post。我的帖子应用程序将处理创建,删除帖子,帖子列表的所有功能。我的主应用程序是我的主页,该主页将显示所有帖子,例如,类似于Facebook的主页。

主应用当前对用户进行身份验证,而对不进行身份验证。我为我的帖子应用创建了视图和模板,现在我想将其包含在Main的应用首页中。不确定如何执行此操作。不要求任何人编写代码,但至少给出了如何实现此目标的结构。

应用程序的基本结构:

--Main_app
  --_views.py
  --templates
    --home.html
--posts_app
  --_views.py
  --templates
    --posts.html

posts_app视图当前包含的文件之一是:

def posts_list(request):
    #return HttpResponse("<h1> List a posts. </h1>")
    render(requests, "posts.html", {})

templates / posts.html包含以下文件:

<!DOCTYPE html>
<html lang="en">
  <body>
    <h1>Posts template is working</h1>
  </body>
</html>

在我的main_app模板/ html中:

{% if user.is_authenticated %}
<h1>Homepage</h1>
<!-- Posts template -->
{% include "posts/templates/posts.html" %} 
{% endif %}

当时对我来说,仅将模板从posts应用程序导入到主应用程序就可以了。显然没有用,所以我做了一些研究,找不到一个确定的解决方案,是否有所谓的模板继承的东西,应该将我的观点从帖子中导入到main中。我不确定。任何帮助表示赞赏。

4 个答案:

答案 0 :(得分:0)

如果要使用同一模板,最好的方法是将模板添加到项目目录中而不是应用程序中。

-myproject\
          -Main_app\
          -posts_app\
          -templates\
                     -template_name.html

然后在设置中添加

    TEMPLATES = [
       {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],# Add this line
        'APP_DIRS': True, 
         ........

在您看来,您可以像template_name.html那样直接引用

其他方法是在类似的目录中创建模板

myproject\
         -Main_app\
                   -templates\
                             -Main_app\
                                        mytemplate.html
         -posts_app\

现在您可以通过引用Main_app\mytemplate.html

来使用它

在这种情况下,第一个非常有效。

答案 1 :(得分:0)

您可以做的是将模板文件夹放在项目目录的根目录下。所以不用

--Main_app
  --_views.py
  --templates
    --home.html
--posts_app
  --_views.py
  --templates
    --posts.html

你可以

--Main_app
  --_views.py

--posts_app
  --_views.py
--templates
  --SHARED.html
  --main
    --home.html
  --posts
    --posts.html

在您看来,您可以执行以下操作:

return render(request, 'SHARED.html', context)  # For shared

return render(request, 'posts/posts.html', context)  # For template in posts

答案 2 :(得分:0)

最好在根项目文件夹中创建一个单独的templates目录。这样,您可以在任何所需的应用程序中访问html文件。您的目录结构如下所示:

.
├── blog
│   ├── admin.py
│   ├── apps.py
│   ├── __init__.py
│   ├── migrations
│   │   ├── 0001_initial.py
│   │   ├── __init__.py
│   │   └── __pycache__
│   │       ├── 0001_initial.cpython-35.pyc
│   │       └── __init__.cpython-35.pyc
│   ├── models.py
│   ├── __pycache__
│   │   ├── admin.cpython-35.pyc
│   │   ├── apps.cpython-35.pyc
│   │   ├── __init__.cpython-35.pyc
│   │   ├── models.cpython-35.pyc
│   │   ├── urls.cpython-35.pyc
│   │   └── views.cpython-35.pyc
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── blog_project
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── __init__.cpython-35.pyc
│   │   ├── settings.cpython-35.pyc
│   │   ├── urls.cpython-35.pyc
│   │   └── wsgi.cpython-35.pyc
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── db.sqlite3
├── manage.py
├── Pipfile
├── Pipfile.lock
├── static
│   └── css
│       └── base.css
└── templates
    ├── base.html
    ├── home.html
    ├── post_detail.html
    └── post_new.html

This is a simple blog I made using Django

如果您想要参考,可能会有所帮助。

答案 3 :(得分:0)

对于通过不同应用程序交叉加载模板,我建议对项目进行结构设计,以使templates是一个单独的目录,这将以两种方式使您受益:

  1. 稍后将前端与后端完全分离会更容易。
  2. 它将增加模块化,因为它将减少应用程序之间的耦合。

示例模板主管:

── templates
│   ├── main
│   ├── another_cool_app
│   ├── accounts
│   ├── posts
│   │   ├── timeline.html
│   │   ├── post_details.html

以此类推。

要在其他模板中加载模板,您只需:

{% include "posts/timeline.html" with posts_list=user.friends_posts %}

快乐的编码。