当前位置: 首页 > 面试题库 >

如何将多个可重复使用的Django应用绑定在一起?

韦正业
2023-03-14
问题内容

我尽力编写可重复使用的Django应用程序。现在我很困惑如何将它们放在一起以获得最终项目。

这是我的意思的示例:我有一个图片应用程序,可以存储,调整大小和显示图像。我也有一个Weblog应用程序,用于存储,编辑和显示文本。现在,我想将两者结合起来以显示带有图像的博客文章。

为此,我可以将外键字段放在博客中以指向图片。但是如果没有图片应用,就无法使用该博客。另外,我可以创建第三个应用程序,该应用程序负责连接两者。

什么是“最佳实践”方法?

编辑:谢谢您的很好的答案,但我仍在寻找如何解决此问题的更实际的示例。完成我的示例:有时最好在不使用图片应用程序的情况下使用博客应用程序。但是,如果我对依赖项进行硬编码,则不再可能。那么将第三个应用程序结合起来又如何呢?


问题答案:

引言在答案的底部(更直接地回答)。我假设您有一个名为Text的文本处理应用程序,另一个名为Pictures的图像处理应用程序,另一个名为Blog的博客处理应用程序。

大图

您将需要学习有关python程序员的模板语言的手册。想法是,每件事都在其自己的应用程序中,并且您有第三个应用程序可以连接所有内容。然后,应用程序应根据您的喜好提供其模型和视图(请记住,让您专注于应用程序应做的事情),并提供一组模板标签。

如何制作包含标签

制作包含标签,这真的很容易!它会提醒您编写普通视图。

在您的应用文件夹中创建目录templatetags。还要__init__.py在此templatetags中创建一个文件(因此目录成为python包)。

然后创建一个python文件。名称很重要,您将在{% load xyz %}将使用您的应用程序的模板中使用此名称。例如,如果调用文件picturestags.py,您将调用
{% load picturestags %}将使用该文件的所有模板。

首先在文件中添加一些您不需要考虑太多的策略,只需在其他任何内容之前添加以下内容:

from django.template import Library
register = Library()

然后通过定义与标签名称相同的函数来添加标签。在示例中,我将其称为display_picture,它将使用一个参数url。该函数应创建一个将在模板中使用的字典。我的示例仅显示URL指向的图片。

@register.inclusion_tag('pictures/display_picture.html')
def display_picture(url):
    return {'picture': url}

在您的应用中创建路径模板/图片,并在其中包含以下内容创建文件display_picture.html:

<img src="{{ picture }}" />

如您所知,@
register将其标记为一个标签,在display_picture返回字典中的内容就是您可以在display_picture.html中使用的内容。非常像您的普通视图功能。

最后,您将得到以下文件:

pictures/
    __init__.py
    models.py
    views.py
    tests.py
    templates/
        pictures/
            display_picture.html
    templatetags/
        picturetags.py

这就是您需要添加到Picture应用程序中的所有内容。要在Blog应用中使用此功能,您需要将图片添加到INSTALLED_APPS。然后在模板中,需要使用您自己的新近烘焙的标签,首先将其加载:{% load picturestags %}然后{% display_picture https://www.google.com/intl/sv_ALL/images/logos/images_logo_lg.gif %}像这样添加标签:

{% load picturestags %}
<html>
    <body>
        {% display_picture https://www.google.com/intl/sv_ALL/images/logos/images_logo_lg.gif %}
    </body>
</html>

结果

这只是一个小例子,但是您可以看到扩展它非常容易。您的博客可以通过导入模型和外键来连接Text and
Pictures应用程序。某个博客文章具有文本和图片的连接。您的blog_post.html-template可能看起来像(简化):

{% load picturestags %}
{% load texttags %}
<html>
    <body>
        <h1>{{ subject }}</h1>
        <div class="article">{% article_to_html articleid %}</div>
        <div class="article_picture">{% display_picture %}</div>
    </body>
</html>

请注意,只有Blog具有依赖项,并且它是应该具有的依赖项(没有文本和图片的博客都没有,但是没有文本的图片也可以存在)。外观和位置应该并且可以由CSS和DIV
/ SPAN标签控制。这样,您可以将您的Picture应用程序带给对Text应用程序一无所知的人并使用它,以不同的方式显示图片,而无需触摸代码!

自从我昨天才了解到这一点以来,唯一知道的就是包含标记。我认为Django为简化生活提供了便利。在文档页面上,还有很多其他内容(包括如何在没有“快捷方式”的情况下很难制作“真实”标签)。因此,如果您发现此方法有局限性,请阅读文档…它有很多示例。它还讨论了如何制作过滤器,simple_tags,线程注意事项和其他高级内容。

介绍

我确实遇到了这个问题,因为您和我也想要的东西与我读过的答案不同(我不是说答案很糟糕,他们帮助我学习了很多,并给了我很多见解,但我希望我现在写这本书)
。我设法弄清了一些不太明显的问题,这要归功于您的问题,并且绝对要感谢Stack
Overflow,所以即使是一个半岁的问题也可能被放弃了,这也是我的贡献(可以帮助一两个Googler)!

我还从Google Tech
Talk可重用应用程序中获得了很多启发。最后(43分钟),他提到了django-
tagging之类的一些很好的例子,这就是他所说的如何编写可重用应用程序的模型。这给了我所有这些想法,因为django-
tagging是解决我们曾经/已经遇到的这个问题的方式。

现在,在我写完所有这些内容(花了一个小时)之后,我第一次感到自己可能会贡献自己,而不只是Google,而是关注别人在做什么,或者抱怨别人不在写我需要做的事情。我第一次要负责写我的观点,以便其他人可以在Google上搜索它(只好写这段:-),因为它感觉真的很棒,即使它可能被切成碎片或被忽略和遗忘了)。



 类似资料:
  • 由于我对js和jquery相当陌生,我想知道是否可以将多个键绑定到一个事件。我尝试了、和,但没有运气。 我希望将和绑定在一个大小写中,而不是另一个大小写。

  • 我在使用JAXB解析XML时遇到了这个问题。下面是所讨论的XML的简化布局: 我遇到的问题是,这些引用是在linkage标记下发送的,而linkage标记不是唯一的,而且也没有类似于根的“linkage”,这样我就可以轻松地用Java将其包装到列表中,因为generalInformation标记中有其他标记。以下是我到目前为止的设置方式: 所以我的问题是,如何配置GeneralInformatio

  • 问题内容: 快速使用以下语法进行流控制 在这种情况下 ,真值上下文的语义是什么 ? 是否允许 表达式链接 (如下所示)? 如果是这样,布尔表达式是否会短路? 问题答案: 首先检查它是否为零或是否有数据。如果为零,则不会执行if语句。如果有数据,则将数据解包并分配给if语句的范围。然后执行括号内的代码。 无法在一个if语句中链接此功能。不直接评估为布尔值。最好将“ if let”视为一个特殊关键字。

  • 这个问题我已经被问过很多次了,而且一直困扰着我。 我们有一个服务类,有3个DAO方法更新3个不同的表。这种设计使得对所有三个表的更新都应该是原子的。我有3个线程分别调用我的服务类,对于每个DAO方法更新,如何使用Spring事务或任何事务管理器将所有线程(操作)保持在单个事务下??有任何关于文档的想法或指针吗??谢谢

  • 我试图将数据框的多行合并成一行,不同值的列合并成一个列表。有多个列具有不同的值。 在一个列表中只需设置一列('b'),效果很好,但我不知道如何对多个列进行设置。 数据帧: 首选数据帧后期操作: 有没有一个简单的方法可以做到这一点?