快捷搜索:  汽车  科技

django审核功能怎么实现(七爪源码如何使用)

django审核功能怎么实现(七爪源码如何使用)hx-trigger 属性允许您指定触发 AJAX 请求的内容。注意:这可能不是您习惯的传统事件监听器。 来自 HTMX 文档。选项一如果您只需要处理整个项目中一两个视图的整页重新加载,选项一是理想的,因为它不遵循 DRY 原则。<div hx-get="view-url/" hx-trigger="load" hx-target="#htmxCanvas"></div>这个选项非常简单。 加载模板时,它将获取属于提供的 url 的视图并在提供的目标内呈现响应。

探索用例场景。

django审核功能怎么实现(七爪源码如何使用)(1)

在将 HTMX 与 Django 一起使用时,您可能会遇到的一个常见问题是在使用 hx-target 属性和 hx-push-url 时处理整页重新加载。 在解决这个问题时,我们可以使用一些选项。

  • 选项一是为每个模板添加一个自定义事件侦听器,并使用 hx-push-url 将部分谁的 url 推送到浏览器的历史记录。
  • 选项二是扩展 Django 的默认 TemplateResponseMixin 来处理 HTMX 请求。
  • 选项三涉及创建自定义中间件类并使用 process_template_request 方法。

先决条件

本文假设您已经开始了一个新的 Django 项目,在静态文件中包含了 HTMX,并安装了 django-Htmx 应用程序。

选项一

如果您只需要处理整个项目中一两个视图的整页重新加载,选项一是理想的,因为它不遵循 DRY 原则。

<div hx-get="view-url/" hx-trigger="load" hx-target="#htmxCanvas"></div>

这个选项非常简单。 加载模板时,它将获取属于提供的 url 的视图并在提供的目标内呈现响应。

注意:这可能不是您习惯的传统事件监听器。 来自 HTMX 文档。

hx-trigger 属性允许您指定触发 AJAX 请求的内容。

而“load”被描述为HTMX支持的非标准事件。

选项二

当您想在大多数视图中处理 htmx 请求时,此选项最适合,但不一定是所有视图。 我们从创建自定义 mixin 类 HtmxResponseMixin 并继承 Django 的 TemplateResponseMixin 开始。 从那里我们将覆盖 get_template_names 方法。

class HtmxResponseMixin(TemplateResponseMixin): def get_template_names(self): app_name = resolve(self.request.path)app_name if self.request.htmx: return [f"{app_name}/partials/{self.template_name}"] return [f"{app_name}/{self.template_name}"]

在 get_template_names 内部,我们需要获取我们请求的视图所属的应用程序的名称。 为此,我们需要在项目的 url 中包含一个 app 命名空间。 例如:

path('app_path/' include(('app.urls' 'app_namespace')))

最后,我们检查对 htmx 实例的请求并返回正确的模板。

模板设置

现在,当我们将 mixin 添加到视图时,例如:

class HtmxExampleView(TemplateView HtmxResponseMixin): template_name = 'template_name.html'

如果请求是由 htmx 发出的,它将呈现我们的部分模板,如果不是,则将返回整页模板。 为了避免为每个页面重写我们的内容,我们可以以与 django 兼容的方式设置我们的模板。

首先我们在模板目录中建立一个base.html 文件。

<!DOCTYPE html> <html> <head> <title>{% block title %}{ endblock }</title> <!-- Meta --> <!-- CSS --> <!--JS --> </head> <body> <nav> {% include 'includes/navbar.html' %} </nav> <main id="htmxCanvas"> {% block canvas %} {% endblock %} </main> </body> </html>

然后我们在 templates/app_name 目录中设置 template_name.html 文件。

{% extends '../base.html' %} {% block title %}Example Template{% endblock %} <!-- You can include other elements here such as breadcrumbs --> {% block canvas %} {% include 'app_name/partials/template_name.html' %} {% endblock %}

最后我们可以在 templates/app_name/partials 目录中创建部分模板文件。 在那里,我们可以检查对 htmx 实例的请求,例如更新页面标题、面包屑,甚至使用 Django 的消息框架包含消息。 下面是正常的画布内容,将再次使用整页模板中的 {% include %} 模板标签或通过 htmx 请求呈现。

{% if request.htmx %} <script>document.title = "Example Template"</script> {% endif %} <!-- Canvas content --> <h1>Thank you for following along</h1>

至此,您可以看到我们如何使用 htmx 与我们的应用程序交互以创建类似 SPA 的界面。 选项三使用自定义中间件将这个概念更进一步。

选项三

最后一个选项的工作方式与第二个类似,但更隐含。 我们从定义中间件类开始,默认情况下它需要 __init__ 方法来接受 get_response 参数。

接下来是每次发出请求时都会调用的 __call__ 方法。 目前它只需要返回一个响应对象供 process_template_response 方法处理。 这个特殊的方法是一个中间件钩子,它在视图执行完成后被调用。

class HtmxResponsemiddleware(object): def __init__(self get_response): self.get_response = get_response def __call__(self request): return self.get_response(request) def process_template_response(self request response): app_name = resolve(request.path).app_name if app_name in settings.HTMX_APPS: if request.htmx: response.template_name = f"{app_name}/partials/{response.template_name[0]}" else: response.template_name = f"{app_name}/{response.template_name[0]}" return response

在 process_template_response 内部,我们开始看到与选项二的相似之处。 我们的应用程序仍然需要命名空间,但之后我们需要在 settings.py 文件中创建一个名为 HTMX_APPS 的新列表,并检查请求是否属于此列表中的应用程序。 在设置中,我们可以将我们的类添加到 MIDDLEWARE 列表中。

HTMX_APPS = [ 'app_name' ] MIDDLEWARE = [ ... 'app_name.middleware.HtmxResponseMiddleware' ]

这样我们的自定义中间件类只会影响我们明确定义的应用程序,从而防止与其他第三方应用程序(例如默认的 django 管理应用程序)发生错误。

最后,我们检查对 htmx 实例的请求,为响应的 template_name 属性提供正确的模板并返回响应对象,该对象必须实现一个渲染方法。 这意味着任何 django 默认的基于类的视图都可以很好地与这个中间件类一起工作。

模板设置遵循与选项 2 相同的方法。

关注七爪网,获取更多APP/小程序/网站源码资源!

猜您喜欢: