【问题标题】:Django - using different apps together in a projectDjango - 在一个项目中一起使用不同的应用程序
【发布时间】:2013-03-12 21:14:29
【问题描述】:

到目前为止,在我发现的基本 Django 教程和文档中,应用程序被视为项目的一些独立部分。 不过,我还没有找到在复杂项目中同时使用它们的解决方案。

我们可以在某个网址domain/signup注册,由users.views.signup处理。

  • 对于 GET 请求,signup 呈现 signup.html
  • 对于 POST 请求,在评估发布的数据后,它要么 使用一些消息呈现signup.html 或注册一个新用户, 让他/她登录并重定向到某个地方。

我们可以在domain/new_post(或domain/user/new_post)创建一个新帖子,由posts.views.new_post处理。它的作用类似于signup 处理程序:

  • 对于 GET 请求,它会呈现 new_post.html
  • 对于 POST 请求,它会评估发布数据,然后呈现 new_post.html 带有消息或注册新帖子并重定向 某处。


一个一般的网站由多个应用程序组成,在某些 url 处显示的请求的网页提供了来自多个应用程序的功能。
例如,登录一些流行的社交网站后,我们可以在我们的墙上创建新条目,搜索用户(通常是更广泛的搜索,但为了简单起见,我们只处理用户),广告和我们的朋友也可能是列在边栏中。

这些部分是如何从不同应用的不同视图和模板构建的?
为了使问题更具体:

  • 对于在某个 url 收到的 GET 请求,我们如何显示 用户搜索表单、新帖子表单和好友列表一起使用?
    如果我们通过一些项目级别的公共视图来做到这一点,那么应用级别的视图呢?
    我已经读到{% include %} 标签对于从几个“子模板”构建模板很方便,但是包含的模板所采用的不同变量呢?
  • 我们如何处理与用户搜索相关的 GET 请求和可能从同一 URL 发送的与新帖子相关的 POST 请求?
    (“从 url 发送的请求”的表述可能不恰当,但用户可以通过对显示在特定 url 的页面进行操作来发送不同的请求。)
  • 此外,不同的组件应保持解耦。

注意:这个问题对于 SO 来说可能太笼统了,所以除了详细的答案之外,我还希望得到资源,可能还有“实际中”使用不同应用程序的示例。

【问题讨论】:

    标签: django django-templates django-views django-apps


    【解决方案1】:

    对于在某个 url 收到的 GET 请求,我们如何显示 用户搜索表单、新帖子表单和好友列表一起使用?

    您可以请求从任何视图呈现任何模板。 Django 将在每个注册的应用程序中搜索模板以查找template 目录。或者您可以使用TEMPLATE_DIR 指定您自己的模板目录,但您似乎已经从下一个问题中知道了这一点......

    如果我们通过一些项目级别的通用视图来做到这一点,那么 应用级视图?

    您能否尝试更深入地解释这个问题?

    我读到 {% include %} 标签对于构建模板很方便 来自几个“子模板”,但是不同的变量呢 包含的模板需要什么?

    来自docs

    包含的模板使用模板的上下文呈现 包括它。

    如果您有一个部分模板,用于包含,例如:

    # hello.html
    <h2>Hello {{ person.name }}</h2>
    

    另一个模板包含它:

    # greeting.html
    {% include 'hello.html' %}
    
    
    render_to_response('greeting.html', {})
    

    输出将是Hello,因为模板上下文中没有person

    我不太明白你的第二个要点。你的 django 包只是一个 python 包。如果您有两个应用程序,您可以选择任何方式导入代码,从两个不同的应用程序中导入模块。

    例如,在大多数项目中,我最终都会拥有一个common 应用程序。这通常包含整个 django 项目中使用的实用程序。它通常包含我的基本测试类。

    在您的应用中,您可以只导入

    from yourproject.common.utils import a_function

    为了帮助解耦,django 提供了一个signals 框架。您的应用可以发出和接收信号。

    Django 包含一个“信号调度器”,有助于解耦 当在其他地方发生操作时,应用程序会收到通知 框架。简而言之,信号允许某些发送者通知 已发生某些操作的一组接收器。他们特别 当多段代码可能对相同的事件感兴趣时很有用。

    【讨论】:

    • "如果我们通过一些项目级别的公共视图来做,那么应用级别的视图呢?" --> 在应用程序“posts”中,我们定义了一个 create_post() 视图,它使用可选的上下文变量 error_msg 呈现 post_form.html。如果某些验证失败,则此 error_msg 在 create_post() 中定义。如果我从应用程序的 create_post() 以外的视图呈现 post_form.html,我还需要在该视图中进行验证,否则模板永远不会得到 error_msg 变量。
    • 我为什么要从其他视图渲染post_form.html?当我在项目中使用该应用程序时,例如社交博客,则用户帐户将由 user_account() 视图处理。我想将呈现的post_form 放在用户帐户页面的某些部分,例如在边栏中。
    • 至于第二个要点..我向www.mysite.com/myaccount/发送了一个GET请求。相关视图(比如说myaccount())返回一个包含两个表单html 元素的页面:user_searchnew_post。第一个将在users 应用程序上运行,第二个将在posts 应用程序上运行。我应该以myaccount() 申请什么视图?我应该在两个应用程序之一中定义它吗?或在第三个应用程序中?这一个视图如何处理与两个不同应用程序相关的两个表单提交?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 2017-11-19
    • 2014-02-15
    • 2022-01-16
    • 2019-06-25
    • 2016-06-20
    • 2023-01-19
    相关资源
    最近更新 更多