Django Semantic UI admin theme

Overview

Django Semantic UI admin theme

django-semantic-admin

A completely free (MIT) Semantic UI admin theme for Django. Actually, this is my 3rd admin theme for Django. The first was forgettable, and the second was with Pure CSS. Pure CSS was great, but lacked JavaScript components.

Semantic UI looks professional, and has great JavaScript components.

Log in to the demo with username django and password semantic-admin: https://semantic-admin.com

Documentation is on GitHub Pages.

Why?

  • Looks professional, with a nice sidebar.
  • Responsive design, even tables can stack responsively on mobile.
  • JavaScript datepicker and timepicker components.
  • JavaScript selects, including multiple selections, which integrate well with Django autocomplete fields.
  • Semantic UI has libraries for React and Vue, in addition to jQuery. This means this package can be used to style the admin, and custom views can be added with React or Vue components with the same style.

Install

Install from PyPI:

pip install django-semantic-admin

Add to settings.py before django.contrib.admin:

INSTALLED_APPS = [
    "semantic_admin",
    "django.contrib.admin",
    ...
]

Usage

Instead of admin.ModelAdmin, admin.StackedInline, or admin.TabularInline:

class ExampleStackedInline(admin.StackedInline):
    pass

class ExampleTabularInline(admin.TabularInline):
    pass

class ExampleAdmin(admin.ModelAdmin):
    inlines = (ExampleStackedInline, ExampleTabularInline)

Inherit from their Semantic equivalents:

from semantic_admin import SemanticModelAdmin, SemanticStackedInline, SemanticTabularInline

class ExampleStackedInline(SemanticStackedInline):
    pass

class ExampleTabularInline(SemanticTabularInline):
    pass

class ExampleAdmin(SemanticModelAdmin):
    inlines = (ExampleStackedInline, ExampleTabularInline)

Awesome optional features

  1. Optional integration with django_filter:

django-filter

To enable this awesome feature, add filter_class to your Django admin:

from semantic_admin.filters import SemanticFilterSet

class DemoFilter(SemanticFilterSet):
    class Meta:
        model = Demo
        fields = ("demo_field",)

class DemoAdmin(SemanticModelAdmin):
    filter_class = DemoFilter
  1. HTML preview in Django autocomplete_fields:

html5-autocomplete

To enable this awesome feature, add the semantic_autocomplete property to your Django model:

class DemoModel(models.Model):
    @property
    def semantic_autocomplete(self):
        html = self.get_img()
        return format_html(html)

Contributing

Install dependencies with poetry install. The demo is built with invoke tasks. For example, cd demo; invoke build.

Notes

Please note, this package uses Fomantic UI the official community fork of Semantic UI.

Comments
  • How to show date picker (calendar)?

    How to show date picker (calendar)?

    I can't put calendar as example in https://semantic-admin.com at field birthdate. Is necessary an other action ?

    Other question, exists suports other languages like Pt-br on calendar?

    opened by Edilton 7
  • ⬆️ Bump django from 4.0.1 to 4.0.2

    ⬆️ Bump django from 4.0.1 to 4.0.2

    Bumps django from 4.0.1 to 4.0.2.

    Commits
    • b12be7a [4.0.x] Bumped version for 4.0.2 release.
    • f9c7d48 [4.0.x] Fixed CVE-2022-23833 -- Fixed DoS possiblity in file uploads.
    • 0142204 [4.0.x] Fixed CVE-2022-22818 -- Fixed possible XSS via {% debug %} template tag.
    • 6928227 [4.0.x] Fixed #33480 -- Fixed makemigrations crash when renaming field of ren...
    • aff79be [4.0.x] Fixed #33468 -- Fixed QuerySet.aggregate() after annotate() crash on ...
    • 7a1c653 [4.0.x] Updated translations from Transifex.
    • 9a9c5b4 [4.0.x] Fixed #33459 -- Clarified index type in full text search docs.
    • 7c2d4d9 [4.0.x] Fixed #33462 -- Fixed migration crash when altering type of primary k...
    • f4de870 [4.0.x] Fixed #33048 -- Doc'd that DEBUG static files requests don't use midd...
    • f82ca84 [4.0.x] Fixed #33407 -- Fixed .radiolist admin CSS.
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 2
  • Add `django-filter` to dependency list

    Add `django-filter` to dependency list

    Hi,

    I created a new Django project, installed django-semantic-admin and added it in INSTALLED_APPS as described in the README. On the first access to /admin a ModuleNotFoundError exception is raised:

    ModuleNotFoundError: No module named 'django_filters'
    

    As django-filter is used in two files (https://github.com/globophobe/django-semantic-admin/search?q=django_filters), I guess the library should be moved to Poetry's dependencies instead of dev-dependencies https://github.com/globophobe/django-semantic-admin/blob/3f71d25f4ed93894e5c610e9c6cb7d8b3e25fcb0/pyproject.toml#L29

    opened by vrialland 2
  • run project

    run project

    Please add README.md with installation steps.

    Is there any way to roll this repository to an empty Django project? And are there any requirements.

    Thank you for earlier )

    opened by InzGIBA 1
  • Version 0.3.7

    Version 0.3.7

    • Update packages
    • Dim page on pusher open
      • Closes https://github.com/globophobe/django-semantic-admin/issues/55
    • Show user/password in login error message
      • Suffices to close https://github.com/globophobe/django-semantic-admin/issues/61
    opened by globophobe 0
  • Version 0.3.6

    Version 0.3.6

    • Set demo user, pass in placeholder.
    • Use empty str on picture delete. Closes https://github.com/globophobe/django-semantic-admin/issues/59
    • Fix toggle target. Closes https://github.com/globophobe/django-semantic-admin/issues/58
    • Build with local egg. Closes https://github.com/globophobe/django-semantic-admin/issues/56
    opened by globophobe 0
  • Version 0.3.5

    Version 0.3.5

    • Update Fomantic UI v2.8.8
    • Correct readonly field height. Closes https://github.com/globophobe/django-semantic-admin/issues/47
    • Add get_filterset_class, supporting both filter_class and filterset_class. Closes https://github.com/globophobe/django-semantic-admin/issues/44
    • Removed minified JS. Closes https://github.com/globophobe/django-semantic-admin/issues/5
    • Add initial docs for customization
    opened by globophobe 0
  • Upgrade demo to django 4.1

    Upgrade demo to django 4.1

    • Unpin dev dependencies
    • Open first accordion by default. Closes https://github.com/globophobe/django-semantic-admin/issues/48
    • Adjust sidebar border. Closes https://github.com/globophobe/django-semantic-admin/issues/27
    opened by globophobe 0
  • ⬆️ Bump django from 4.0.4 to 4.0.6

    ⬆️ Bump django from 4.0.4 to 4.0.6

    Bumps django from 4.0.4 to 4.0.6.

    Commits
    • caad462 [4.0.x] Bumped version for 4.0.6 release.
    • c732152 [4.0.x] Updated man page for Django 4.0.6.
    • 0dc9c01 [4.0.x] Fixed CVE-2022-34265 -- Protected Trunc(kind)/Extract(lookup_name) ag...
    • a2b88d7 [4.0.x] Fixed typo in docs/topics/signals.txt.
    • 2b901c1 [4.0.x] Fixed GEOSTest.test_emptyCollections() on GEOS 3.8.0.
    • 4d20d2f [4.0.x] Fixed docs build with sphinxcontrib-spelling 7.5.0+.
    • 8a294ee [4.0.x] Added stub release notes and release date for 4.0.6 and 3.2.14.
    • 1c28443 [4.0.x] Fixed CoveringIndexTests.test_covering_partial_index() when DEFAULT_I...
    • 0f3b250 [4.0.x] Fixed #33789 -- Doc'd changes in quoting table/column names on Oracle...
    • 6661c48 [4.0.x] Updated OWASP Top 10 link in security topic.
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • DRF filter is filterset_class

    DRF filter is filterset_class

    filter_class was used, but perhaps filterset_classis better as DRF is quite popular. Consider supporting both, with eventual filter_class deprecation

    Edit: DRF originally used filter_class

    opened by globophobe 0
  • ⬆️ Bump django from 4.0.2 to 4.0.4

    ⬆️ Bump django from 4.0.2 to 4.0.4

    Bumps django from 4.0.2 to 4.0.4.

    Commits
    • 89807fb [4.0.x] Bumped version for 4.0.4 release.
    • 00b0fc5 [4.0.x] Fixed CVE-2022-28347 -- Protected QuerySet.explain(**options) against...
    • 8008288 [4.0.x] Fixed CVE-2022-28346 -- Protected QuerySet.annotate(), aggregate(), a...
    • 78e553b [4.0.x] Fixed #33628 -- Ignored directories with empty names in autoreloader ...
    • 7700084 [4.0.x] Added stub release notes and release date for 4.0.4, 3.2.13, and 2.2.28.
    • 5137416 [4.0.x] Fixed #32129 -- Adjusted the docs for session expiry helpers.
    • 7d540d6 [4.0.x] Fixed #33598 -- Reverted "Removed unnecessary reuse_with_filtered_rel...
    • f62816b [4.0.x] Updated Oracle docs links to Oracle 21c.
    • 0da9053 [4.0.x] Updated various links to HTTPS and new locations.
    • 7f69c0d [4.0.x] Corrected models.FileField signature in docs.
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Update Fomantic UI v2.9

    Update Fomantic UI v2.9

    • Support file inputs https://fomantic-ui.com/elements/input.html#file-input
    • Consider supporting custom calendar formats https://fomantic-ui.com/modules/calendar.html#custom-format
    opened by globophobe 0
  • Document settings for form fields, and filters

    Document settings for form fields, and filters

    SEMANTIC_APP_LIST should also allow ordering of models within apps. Currently, only orders apps

    Edit: App list ordering documented in https://github.com/globophobe/django-semantic-admin/pull/54. Form fields and filters still require documentation

    opened by globophobe 0
Releases(v0.3.7)
  • v0.3.7(Dec 16, 2022)

    What's Changed

    • Version 0.3.7 by @globophobe in https://github.com/globophobe/django-semantic-admin/pull/62

    Full Changelog: https://github.com/globophobe/django-semantic-admin/compare/v0.3.6...v0.3.7

    Source code(tar.gz)
    Source code(zip)
  • v0.3.6(Nov 5, 2022)

    What's Changed

    • Version 0.3.6 by @globophobe in https://github.com/globophobe/django-semantic-admin/pull/60

    Full Changelog: https://github.com/globophobe/django-semantic-admin/compare/v0.3.5...v0.3.6

    Source code(tar.gz)
    Source code(zip)
  • v0.3.5(Sep 22, 2022)

    What's Changed

    • Version 0.3.5 by @globophobe in https://github.com/globophobe/django-semantic-admin/pull/54

    Full Changelog: https://github.com/globophobe/django-semantic-admin/compare/v0.3.4...v0.3.5

    Source code(tar.gz)
    Source code(zip)
  • v0.3.4(Sep 21, 2022)

    What's Changed

    • Revert international datetime by @globophobe in https://github.com/globophobe/django-semantic-admin/pull/53

    Full Changelog: https://github.com/globophobe/django-semantic-admin/compare/v0.3.3...v0.3.4

    Source code(tar.gz)
    Source code(zip)
  • v0.3.3(Sep 21, 2022)

    What's Changed

    • ⬆️ Bump django from 4.0.2 to 4.0.4 by @dependabot in https://github.com/globophobe/django-semantic-admin/pull/43
    • ⬆️ Bump django from 4.0.4 to 4.0.6 by @dependabot in https://github.com/globophobe/django-semantic-admin/pull/45
    • Update pkgs by @globophobe in https://github.com/globophobe/django-semantic-admin/pull/46
    • Upgrade demo to django 4.1 by @globophobe in https://github.com/globophobe/django-semantic-admin/pull/50
    • Version 0.3.3 by @globophobe in https://github.com/globophobe/django-semantic-admin/pull/51

    Full Changelog: https://github.com/globophobe/django-semantic-admin/compare/v0.3.2...v0.3.3

    Source code(tar.gz)
    Source code(zip)
  • v0.3.2(Mar 12, 2022)

    What's Changed

    • Fix action button margin for computer by @globophobe in https://github.com/globophobe/django-semantic-admin/pull/41
    • Downgrade demo django 3.2 by @globophobe in https://github.com/globophobe/django-semantic-admin/pull/42

    Full Changelog: https://github.com/globophobe/django-semantic-admin/compare/v0.3.1...v0.3.2

    Source code(tar.gz)
    Source code(zip)
  • v0.3.1(Feb 11, 2022)

    What's Changed

    • Fix/action checkbox width by @globophobe in https://github.com/globophobe/django-semantic-admin/pull/36
    • Fix action form on mobile by @globophobe in https://github.com/globophobe/django-semantic-admin/pull/35
    • Update packages. by @globophobe in https://github.com/globophobe/django-semantic-admin/pull/38

    Full Changelog: https://github.com/globophobe/django-semantic-admin/compare/v0.3.0...v0.3.1

    Source code(tar.gz)
    Source code(zip)
  • v0.3.0(Jan 15, 2022)

    What's Changed

    • Add SEMANTIC_CALENDAR_OPTIONS setting by @globophobe in https://github.com/globophobe/django-semantic-admin/pull/33

    Full Changelog: https://github.com/globophobe/django-semantic-admin/compare/v0.2.9...v0.3.0

    Source code(tar.gz)
    Source code(zip)
  • v0.2.9(Jan 13, 2022)

    What's Changed

    • ⬆️ Bump pillow from 8.4.0 to 9.0.0 by @dependabot in https://github.com/globophobe/django-semantic-admin/pull/31
    • Release v0.2.9 by @globophobe in https://github.com/globophobe/django-semantic-admin/pull/32

    New Contributors

    • @dependabot made their first contribution in https://github.com/globophobe/django-semantic-admin/pull/31

    Full Changelog: https://github.com/globophobe/django-semantic-admin/compare/v0.2.8...v0.2.9

    Source code(tar.gz)
    Source code(zip)
  • v0.2.8(Jan 12, 2022)

    What's Changed

    • Add Intl.DateTimeFormat to calendar by @globophobe in https://github.com/globophobe/django-semantic-admin/pull/28
    • Adjust change list checkbox alignment by @globophobe in https://github.com/globophobe/django-semantic-admin/pull/29

    Full Changelog: https://github.com/globophobe/django-semantic-admin/compare/0.2.7...v0.2.8

    Source code(tar.gz)
    Source code(zip)
  • 0.2.7(Jan 9, 2022)

    What's Changed

    • Fix action checkbox for Django 4 by @globophobe in https://github.com/globophobe/django-semantic-admin/pull/21
    • Support calendar 18n by @globophobe in https://github.com/globophobe/django-semantic-admin/pull/22
    • Update demo by @globophobe in https://github.com/globophobe/django-semantic-admin/pull/24
    • Fix cloud run settings by @globophobe in https://github.com/globophobe/django-semantic-admin/pull/25

    Full Changelog: https://github.com/globophobe/django-semantic-admin/compare/0.2.6...0.2.7

    Source code(tar.gz)
    Source code(zip)
  • 0.2.6(Dec 11, 2021)

    What's Changed

    • Add margin to popup by @globophobe in https://github.com/globophobe/django-semantic-admin/pull/8
    • Add docs with mkdocs by @globophobe in https://github.com/globophobe/django-semantic-admin/pull/10
    • Fix/demo password by @globophobe in https://github.com/globophobe/django-semantic-admin/pull/13
    • Fix screenshot numbering by @globophobe in https://github.com/globophobe/django-semantic-admin/pull/15
    • Feature/support django 4 by @globophobe in https://github.com/globophobe/django-semantic-admin/pull/17

    Full Changelog: https://github.com/globophobe/django-semantic-admin/commits/0.2.6

    Source code(tar.gz)
    Source code(zip)
Owner
Alex
Currently in Fintech. GSD with Python and JavaScript. 機械学習に興味があります。
Alex
An improved django-admin-tools dashboard for Django projects

django-fluent-dashboard The fluent_dashboard module offers a custom admin dashboard, built on top of django-admin-tools (docs). The django-admin-tools

django-fluent 326 Nov 09, 2022
Extendable, adaptable rewrite of django.contrib.admin

django-admin2 One of the most useful parts of django.contrib.admin is the ability to configure various views that touch and alter data. django-admin2

Jazzband 1.2k Dec 29, 2022
A minimalist GUI frontend for the youtube-dl. Takes up less than 4 KB.

📥 libre-DL A minimalist GUI wrapper for youtube-dl. Written in python. Total size less than 4 KB. Contributions welcome. You don't need youtube-dl pr

40 Sep 23, 2022
BitcartCC is a platform for merchants, users and developers which offers easy setup and use.

BitcartCC is a platform for merchants, users and developers which offers easy setup and use.

BitcartCC 270 Jan 07, 2023
Sandwich Batch Normalization

Sandwich Batch Normalization Code for Sandwich Batch Normalization. Introduction We present Sandwich Batch Normalization (SaBN), an extremely easy imp

VITA 48 Dec 15, 2022
Legacy django jet rebooted , supports only Django 3

Django JET Reboot Rebooting the original project : django-jet. Django Jet is modern template for Django admin interface with improved functionality. W

215 Dec 31, 2022
django-admin fixture generator command

Mockango for short mockango is django fixture generator command which help you have data without pain for test development requirements pip install dj

Ilia Rastkhadiv 14 Oct 29, 2022
A flat theme for Django admin interface. Modern, fresh, simple.

Django Flat Theme django-flat-theme is included as part of Django from version 1.9! 🎉 Please use this app if your project is powered by an older Djan

elky 416 Sep 22, 2022
FastAPI Admin Dashboard based on FastAPI and Tortoise ORM.

FastAPI ADMIN 中文文档 Introduction FastAPI-Admin is a admin dashboard based on fastapi and tortoise-orm. FastAPI-Admin provide crud feature out-of-the-bo

long2ice 1.6k Jan 02, 2023
Django application and library for importing and exporting data with admin integration.

django-import-export django-import-export is a Django application and library for importing and exporting data with included admin integration. Featur

2.6k Jan 07, 2023
Tactical RMM is a remote monitoring & management tool for Windows computers, built with Django and Vue.

Tactical RMM is a remote monitoring & management tool for Windows computers, built with Django and Vue. It uses an agent written in golan

Dan 1.4k Dec 30, 2022
DyStyle: Dynamic Neural Network for Multi-Attribute-Conditioned Style Editing

DyStyle: Dynamic Neural Network for Multi-Attribute-Conditioned Style Editing

74 Dec 03, 2022
A Django admin theme using Twitter Bootstrap. It doesn't need any kind of modification on your side, just add it to the installed apps.

django-admin-bootstrapped A Django admin theme using Bootstrap. It doesn't need any kind of modification on your side, just add it to the installed ap

1.6k Dec 28, 2022
Django app that enables staff to log in as other users using their own credentials.

Impostor Impostor is a Django application which allows staff members to login as a different user by using their own username and password. Login Logg

Andreu Vallbona Plazas 144 Dec 13, 2022
Disable dark mode in Django admin user interface in Django 3.2.x.

Django Non Dark Admin Disable or enable dark mode user interface in Django admin panel (Django==3.2). Installation For install this app run in termina

Artem Galichkin 6 Nov 23, 2022
EOD (Easy and Efficient Object Detection) is a general object detection model production framework.

EOD (Easy and Efficient Object Detection) is a general object detection model production framework.

383 Jan 07, 2023
Jinja is a fast, expressive, extensible templating engine.

Jinja is a fast, expressive, extensible templating engine. Special placeholders in the template allow writing code similar to Python syntax.

The Pallets Projects 9k Jan 04, 2023
📱 An extension for Django admin that makes interface mobile-friendly. Merged into Django 2.0

Django Flat Responsive django-flat-responsive is included as part of Django from version 2.0! 🎉 Use this app if your project is powered by an older D

elky 248 Sep 02, 2022
Material design for django administration

Django Material Administration Quick start pip install django-material-admin Add material.admin and material.admin.default to your INSTALLED_APPS sett

Anton 279 Jan 05, 2023
Python books free to read online or download

Python books free to read online or download

Paolo Amoroso 3.7k Jan 08, 2023