Hacktoberfest 2026:维护者为十月标记出来的 issue,仍然开放、适合新手。 浏览 Hacktoberfest issue

Lint Django templates with djLint and enable it as a prek hook

未关闭
#252 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

维护者通常 12 天内回复

还没有人认领这个 Issue。

评估

难度
4/5
预计耗时
3-5 天
新手友好度
68/100
Issue 类型
功能
描述清晰度
描述清楚
活跃度
活跃
技术栈
django, python

调研方向

Start with the 13 templates listed in the issue and run uvx --from djlint==1.46.2 djlint pythonie --lint --profile=django to reproduce the reported findings. Then review pyproject.toml, .pre-commit-config.yaml, CONTRIBUTING.md, and CLAUDE.md for the shared configuration and hook documentation. Done means the lint and prek checks pass, the meetup sponsors and bundled theme script still work, and the listed test command succeeds.

由索引模型根据 Issue 内容生成。

描述

enhancement

Context

The repository runs its git hooks with prek (see .pre-commit-config.yaml, added in #249). The hooks cover Python (ruff, django-upgrade, Django checks, missing migrations) and generic files, but nothing checks the Django templates.

djLint is a linter and formatter for HTML templates with template syntax (Django profile). It was evaluated in #249 and left out because it does not pass on the current templates. This issue tracks fixing the templates and then enabling djLint as a prek hook.

Scope

13 templates:

pythonie/core/templates/404.html
pythonie/core/templates/500.html
pythonie/core/templates/base.html
pythonie/core/templates/footer.html
pythonie/core/templates/header.html
pythonie/core/templates/navbar.html
pythonie/core/templates/navbar_tree.html
pythonie/core/templates/core/home_page.html
pythonie/core/templates/core/meetup.html
pythonie/core/templates/core/segment.html
pythonie/core/templates/core/simple_page.html
pythonie/core/templates/core/sponsor.html
pythonie/templates/wagtailembeds/embed_frontend.html

Current state (djLint 1.46.2, master at 90cf69d)

uvx --from djlint==1.46.2 djlint pythonie --lint --profile=django reports 12 errors:

File Line Rule Message
core/templates/500.html 5 H005 <html> should have a non-empty lang attribute
core/templates/base.html 8 H005 <html> should have a non-empty lang attribute
core/templates/base.html 9, 45, 63 H014 Extra blank lines
core/templates/base.html 43, 44, 78 H024 Omit type on scripts and styles
core/templates/core/meetup.html 5 H025 Tag seems to be an orphan (<div class="col-md-12">)
core/templates/header.html 8 H013 <img> should have an alt attribute
core/templates/navbar.html 21, 22 T001 Tags should be wrapped in whitespace ({%include ...%}, {%endfor%})

djlint pythonie --check --profile=django reports that all 13 files would be reformatted (about 216 changed lines in total).

Real markup bugs in core/templates/core/meetup.html

The H025 warning points at actual bugs in the sponsor block of the meetup list:

  1. Line 24: <div class="col-md-8">has a stray backtick, so the browser parses a brokenclassattribute and thecol-md-8` column class is not applied.
  2. <div class="name"> (line 25) is never closed: 5 <div> are opened inside the loop body (col-md-12, sponsor-list, sponsor, col-md-8, name) and only 4 are closed, so the browser closes the elements implicitly and the layout of the sponsor list depends on error recovery.

Tasks

Split the work into separate commits so the review stays easy:

1. Fix the lint errors (fix(templates): ...)
  • meetup.html: remove the stray backtick and close <div class="name"> right after the sponsor name block (before the {% if sponsor.note %} caption, or after it if the caption belongs to the name block; check the rendering).
  • base.html and 500.html: add lang="en" to <html>. In 500.html the <html> tag sits inside IE conditional comments (<!--[if ...]>); the non-IE branch (line 5) is the one djLint flags, add lang="en" to every branch for consistency (or drop the IE conditional comments, IE is no longer supported by Bootstrap/the site).
  • header.html: add alt="Python Ireland" to the logo <img>.
  • base.html: drop type="text/javascript" on the three <script> tags (lines 43, 44, 78). Line 78 is inside {% compress js %}: django-compressor handles scripts without a type attribute as JavaScript, but verify it by rendering a page with COMPRESS_ENABLED=True (or running manage.py compress if offline compression is used) and checking that theme-toggle.js is still bundled.
  • navbar.html: {%include "navbar_tree.html" %} becomes {% include "navbar_tree.html" %}, {%endfor%} becomes {% endfor %}.
  • base.html: remove the extra blank lines.

After this commit, djlint pythonie --lint --profile=django must report 0 errors.

2. Reformat the templates (style(templates): ...), optional

Run djlint pythonie --reformat --profile=django and commit the result on its own. It changes whitespace and indentation only, but djLint also reflows some inline content (for example pythonie/templates/wagtailembeds/embed_frontend.html is collapsed to a single line), so check the rendered pages visually (home page, a simple page, the navbar with nested pages, the meetup list with sponsors, the 404 page).

If the formatter output is not acceptable on some templates, keep only the linter (task 3 without djlint-reformat-django) and mention it in the PR.

3. Configure djLint and enable the prek hook (chore(dev): ...)
  • Add the configuration to pyproject.toml so the CLI, the hook and editors share it:

    [tool.djlint]
    profile = "django"
    # ignore = "H030,H031"  # only if some rules are deliberately skipped, with a comment explaining why
    
  • Add the hooks to .pre-commit-config.yaml, pinned on a tag (latest at the time of writing: v1.46.2, check with gh api repos/djlint/djLint/tags --jq '.[0].name'):

    - repo: https://github.com/djlint/djLint
      rev: v1.46.2
      hooks:
        - id: djlint-reformat-django  # only if task 2 is done
        - id: djlint-django
    

    djLint only targets .html files by default. The vendored assets under pythonie/core/static/{css,fonts,js} are already excluded by the global exclude of the config.

  • Nothing to change in CI: the prek job in .github/workflows/test.yml runs every hook with --all-files. Renovate already updates the hook revisions (the pre-commit manager is enabled in renovate.json, grouped in the "pre-commit hooks" PR).

  • Document djLint in the list of hooks in CONTRIBUTING.md (section "Git Hooks (prek)") and in CLAUDE.md (section "Git Hooks (prek)").

Acceptance criteria

  • prek run --all-files passes, djLint hooks included
  • djlint pythonie --lint --profile=django reports 0 errors
  • The meetup list with sponsors renders correctly (the two bugs in meetup.html are fixed)
  • theme-toggle.js is still loaded and bundled by django-compressor
  • uv run python pythonie/manage.py test pythonie --settings=pythonie.settings.tests passes (run it with env -u DATABASE_URL if a DATABASE_URL is exported in the shell, otherwise the test settings use that database)
  • The CI prek and test jobs are green
  • Separate commits for the fixes, the optional mass reformat and the hook configuration

Out of scope

  • Redesigning the templates or upgrading Bootstrap.
  • base.html loads Typekit from //use.typekit.net/qgj1xay.js. Whether this kit still exists is worth checking, but in a separate issue.
主要语言
Python
星标
17
派生
27
平均合并
59 分钟
30 天内合并 PR
13

环境准备

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

PythonIreland/website 的其他 Issue

查看 PythonIreland/website 的全部 Issue

相似的 Issue

更多 Python Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。