django-oscar-blog
A blog app for django-oscar: posts, an Oscar dashboard section under Content, and posts that can link out to catalogue products they mention.
What this package does, and doesn't, do
- A
Postmodel: title/slug/excerpt/body/featured image/author/status (draft/published)/publish date, plusmeta_title/meta_descriptionfor SEO and arelated_productsmany-to-many ontocatalogue.Product. - Storefront list/detail views (
oscar_blog.urls) and aPostSitemap. - An Oscar dashboard section (
oscar_blog.dashboard) for staff to create, edit, and delete posts — list/create/update/delete views following the exact same conventions as Oscar's owndashboard.pagesapp (flatpages), including its permission model (is_staffby default). - It does not ship a newsletter integration, a product-picker autocomplete widget (the dashboard form uses a plain multi-select — fine at a small catalogue's scale, worth swapping for something like Oscar's own Range product-search UI if it becomes unwieldy), or a "featured products" CTA anywhere in the storefront — see "Adding a CTA" below.
Installation
uv add django-oscar-blog
Add to INSTALLED_APPS, after catalogue/partner (it references
catalogue.Product) and after oscar.config.Shop:
INSTALLED_APPS = [
...,
"oscar_blog.apps.OscarBlogConfig",
"oscar_blog.dashboard.apps.BlogDashboardConfig",
]
Run manage.py migrate — this package ships its own migration.
Wiring the storefront URLs
# urls.py
urlpatterns = [
path("blog/", include("oscar_blog.urls")),
...
]
Templates extend oscar/layout.html under oscar_blog/post_list.html and
oscar_blog/post_detail.html — override them the same way you'd override
any other Oscar template (a project-level templates/oscar_blog/...
directory).
Wiring the dashboard in ("Content" menu)
Oscar's own dashboard.apps.DashboardConfig.get_urls() is a hardcoded
list, not auto-discovered — every dashboard section Oscar ships is added
there directly, and third-party sections have to fork that config the same
way you'd fork any other Oscar app. This package's own test suite
(tests/dashboard.py) is a working example of exactly this fork — copy its
shape into your project, e.g. a dashboard/apps.py:
from django.apps import apps
from django.urls import include, path
from oscar.apps.dashboard.apps import DashboardConfig as OscarDashboardConfig
class DashboardConfig(OscarDashboardConfig):
def ready(self):
super().ready()
self.blog_app = apps.get_app_config("blog_dashboard")
def get_urls(self):
urls = super().get_urls()
urls.append(path("blog/", include(self.blog_app.urls[0])))
return urls
...and swap "oscar.apps.dashboard.apps.DashboardConfig" for your
project's own "yourproject.dashboard.apps.DashboardConfig" in
INSTALLED_APPS.
Then add the nav entry under Content, alongside Pages/Email
templates/Reviews, by overriding OSCAR_DASHBOARD_NAVIGATION (a plain
Django setting — copy Oscar's default from oscar.defaults and insert):
{
"label": _("Blog posts"),
"url_name": "dashboard:blog-post-list",
},
into the "Content" entry's "children" list.
Related products
Post.related_products is a plain (unordered) ManyToManyField onto
catalogue.Product. A published post's detail page lists them under
"Mentioned products", linking to each product's own page
(post_detail.html). Nothing on the Product side surfaces "posts that
mention me" yet — the reverse relation is available as
product.blog_posts.all() if a host project wants to add that to a
product page.
Adding a CTA (deliberately not built here)
This package intentionally ships no newsletter-subscribe or
"promote this product" call-to-action anywhere in its templates — that's
host-project UI/UX scope (placement, copy, branding), not something a
reusable blog app should assume. If your project adds one, the natural
places are oscar_blog/post_list.html/post_detail.html (override them)
or a custom template tag included from there.
Development
uv sync
uv run pytest
tests/settings.py boots a full (stock) Oscar app stack — this package
genuinely depends on Oscar's catalogue models, unlike a framework-agnostic
library, so its tests can't run against bare Django alone.
Metadata
Release files for django-oscar-blog 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| django_oscar_blog-0.1.0.tar.gz | 62.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| django_oscar_blog-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 77.0 kB
Release files / django_oscar_blog-0.1.0.tar.gz
| Download URL | django_oscar_blog-0.1.0.tar.gz |
|---|---|
| Size | 62.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
05e67891c7e70c4b059871515994ab3efb8ea39d729fac76365b730f3aa6971d
|
|
BLAKE2b-256 checksum How to use checksums |
2cfaf50661064b05408263cadccb885d90b1515611079a5b1a1250d8f4a9762b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.9 {"installer":{"name":"uv","version":"0.12.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / django_oscar_blog-0.1.0-py3-none-any.whl
| Download URL | django_oscar_blog-0.1.0-py3-none-any.whl |
|---|---|
| Size | 14.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
9c1d98c7ab8caa70cb915c1a20775d7aa5f632c37b026b4fbd776a5ec31351a4
|
|
BLAKE2b-256 checksum How to use checksums |
e8902590859258d7b89b06e3390acd717e631d02805361a6c2b3704927118504
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.9 {"installer":{"name":"uv","version":"0.12.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|