Lint Django templates with djLint and enable it as a prek hook
Les mainteneurs répondent en général sous 12 jours
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Accessibilité débutants
- 68/100
- Type d'issue
- Fonctionnalité
- Clarté
- Clairement spécifiée
- Activité
- Active
- Domaine
- frontend, testing-qa, tooling
Piste de recherche
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.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
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:
- 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. <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.htmland500.html: addlang="en"to<html>. In500.htmlthe<html>tag sits inside IE conditional comments (<!--[if ...]>); the non-IE branch (line 5) is the one djLint flags, addlang="en"to every branch for consistency (or drop the IE conditional comments, IE is no longer supported by Bootstrap/the site).header.html: addalt="Python Ireland"to the logo<img>.base.html: droptype="text/javascript"on the three<script>tags (lines 43, 44, 78). Line 78 is inside{% compress js %}: django-compressor handles scripts without atypeattribute as JavaScript, but verify it by rendering a page withCOMPRESS_ENABLED=True(or runningmanage.py compressif offline compression is used) and checking thattheme-toggle.jsis 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.tomlso 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 withgh 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-djangodjLint only targets
.htmlfiles by default. The vendored assets underpythonie/core/static/{css,fonts,js}are already excluded by the globalexcludeof the config. -
Nothing to change in CI: the
prekjob in.github/workflows/test.ymlruns every hook with--all-files. Renovate already updates the hook revisions (thepre-commitmanager is enabled inrenovate.json, grouped in the "pre-commit hooks" PR). -
Document djLint in the list of hooks in
CONTRIBUTING.md(section "Git Hooks (prek)") and inCLAUDE.md(section "Git Hooks (prek)").
Acceptance criteria
-
prek run --all-filespasses, djLint hooks included -
djlint pythonie --lint --profile=djangoreports 0 errors - The meetup list with sponsors renders correctly (the two bugs in
meetup.htmlare fixed) -
theme-toggle.jsis still loaded and bundled by django-compressor -
uv run python pythonie/manage.py test pythonie --settings=pythonie.settings.testspasses (run it withenv -u DATABASE_URLif aDATABASE_URLis exported in the shell, otherwise the test settings use that database) - The CI
prekandtestjobs 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.htmlloads Typekit from//use.typekit.net/qgj1xay.js. Whether this kit still exists is worth checking, but in a separate issue.
- Langage dominant
- Python
- Étoiles
- 17
- Forks
- 27
- Merge moyen
- 59 min
- PR mergées (30 j)
- 13
Préparer son environnement
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de PythonIreland/website
-
PSF Grant -UrgentOuverte
Difficulté 5/5 Plus d'une semaine Accessibilité débutants 15/100
PythonIreland/website#205 ·
Les mainteneurs répondent en général sous 12 jours
-
Sponsorship Brochure- Urgent!Ouverte
Difficulté 3/5 1-2 jours Accessibilité débutants 25/100
PythonIreland/website#204 ·
Les mainteneurs répondent en général sous 12 jours
-
dependencies enhancement
Difficulté 2/5 1-3 heures Accessibilité débutants 52/100
PythonIreland/website#187 ·
Les mainteneurs répondent en général sous 12 jours
-
dependencies enhancement
Difficulté 4/5 3-5 jours Accessibilité débutants 25/100
PythonIreland/website#184 · 8 commentaires ·
Les mainteneurs répondent en général sous 12 jours
-
Difficulté 5/5 Plus d'une semaine Accessibilité débutants 25/100
PythonIreland/website#177 ·
Les mainteneurs répondent en général sous 12 jours
Toutes les issues de PythonIreland/website
Issues similaires
-
pydanty:is-working
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
pydantic/pydantic-ai#8843 ·
Les mainteneurs répondent en général sous 1 jour
-
breaking change enhancement server
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
Les mainteneurs répondent en général sous 1 jour
-
bug
Difficulté 2/5 1-3 heures Accessibilité débutants 88/100
sktime/sktime#11310 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
Les mainteneurs répondent en général sous 1 jour
-
needs-triage
Difficulté 2/5 1-3 heures Accessibilité débutants 85/100
Les mainteneurs répondent en général sous 1 jour