Skip to main content

pipeline for slugification edgecases in django

Project description

django-slugify-processor

Custom-slugify() support for django.

Python Package Build Status Docs Code Coverage License

What are slugs?

Slugs are URL's, typically generated from post titles, that you want to be both human readable and a valid URL. They are SEO friendly.

Django provides a slugify() function which is also made available as a default filter.

Django slugs can be automatically generated in django models via packages such as:

The problem

This project is based on an article from devel.tech covering django's import strings.

Corner cases exist with slugification. For instance:

Term django.utils.text.slugify What you want
C c (correct) n/a
C++ c cpp
C# c c-sharp

To make matters worse, if using a specialized model field like AutoSlugField from django-autoslug or django-extensions, the default behavior may be to name the slugs for C++ and C# to "c-1", "c-2" after "c" is taken.

Here's another case, acronyms / shorthands:

Term django.utils.text.slugify What you (may) want
New York City new-york-city nyc
Y Combinator y-combinator yc
Portland portland pdx
Texas texas tx
$ '' (empty) usd, aud, etc?
US$ us usd
A$ a aud
bitcoin bitcoin btc
United States united-states usa
League of Legends league-of-legends league
Apple® iPod Touch apple-ipod-touch ipod-touch

Each website and niche has its own edge cases for slugs. So we need a solution that can scale, where you can craft your own functions.

How django-slugify-processor helps

This builds on top of django.utils.text.slugify to handle your django project's edgecases. By default, django-slugify-processor will be a pass through to django's default behavior. Adding slugification functions via your Django project's settings file allows you to adjust.

Installation

$ pip install django-slugify-processor

Configure

To create a processor, create a function that accepts a string, and returns a string. Assume this is project/app/slugify_processors.py:

def my_processor(value):
   value = value.replace('++', 'pp')
   return value

Inside of your settings, add a SLUGIFY_PROCESSORS list of strings that points to the function. Anything that's compatible with import_string, in your settings file:

SLUGIFY_PROCESSORS = [
   'project.app.slugify_processors.my_processor'
]

Usage

In normal django code

Import slugify from django_slugify_processor.text:

from django_slugify_processor.text import slugify

print(slugify('C++'))
> 'cpp'

Template code

django-slugify-processor is designed to override the built-inslugify filter.

via load

You can load by default via {% load django_slugify_processor %} in your template.

In your settings INSTALLED_APPS:

INSTALLED_APPS = [
    'django_slugify_processor'
]

In your template:

{% load slugify_processor %}
{{"C++"|slugify}}

via built-in

To make this available in all templates, in the OPTIONS of your template engine, add django_slugify_processor.template_tags:

TEMPLATES = [{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'OPTIONS': {
        'builtins': [
            'django_slugify_processor.templatetags.slugify_processor',
        ],
    },
}]

From within the template file:

{{"C++"|slugify}}

Output should be: cpp

Models

For the most up to date documentation, view the documentation for the plugin you're using (e.g. django-autoslug or django-extensions).

To use django-slugify-processor's slugify instead of django's default, there will be a field option to use the function.

django-extensions

Tested with 1.9.7 (2017-11-26):

from django.db import models

from django_extensions.db.fields import AutoSlugField
from django_slugify_processors.text import slugify

class MyModel(models.Model):
    title = models.CharField(max_length=255)
    slug = AutoSlugField(
        populate_from='title',
        slugify_function=slugify
    )

django-autoslug

Tested with 1.9.3 (2017-11-26):

from django.db import models

from autoslug import AutoSlugField
from django_slugify_processors.text import slugify

class MyModel(models.Model):
    title = models.CharField(max_length=255)
    slug = AutoSlugField(
        populate_from='title',
        slugify=slugify
    )

Credits

  • tox.ini based off DRF's (BSD 2-clause licensed)
  • yapf configuration based off RTD / devel.tech's (MIT-licensed)

Project details

Development

Install stable:

$ pip install django-slugify-processor

Local installation:

$ git clone https://github.com/tony/django-slugify-processor.git
$ cd ./django-slugify-processor

Test:

$ make test

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django_slugify_processor-1.10.0.tar.gz (123.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

django_slugify_processor-1.10.0-py3-none-any.whl (7.7 kB view details)

Uploaded Python 3

File details

Details for the file django_slugify_processor-1.10.0.tar.gz.

File metadata

File hashes

Hashes for django_slugify_processor-1.10.0.tar.gz
Algorithm Hash digest
SHA256 a921f33fa26e777b5312a4374be430372076061fe9c8f20f35c83a46610977f1
MD5 0a1aa5682340b291bdd3e1c961dbb5e6
BLAKE2b-256 bbad7e995e194789f58c6a54122c1e9303db34fb51b2ef1035c21ee17400fa47

See more details on using hashes here.

File details

Details for the file django_slugify_processor-1.10.0-py3-none-any.whl.

File metadata

File hashes

Hashes for django_slugify_processor-1.10.0-py3-none-any.whl
Algorithm Hash digest
SHA256 45d1c3bb24ac95016fafcc37c573e0e737b013cac8619fc8f10ec1211774acde
MD5 61a51b418711e4b66a6e3c6d2c686dfe
BLAKE2b-256 092e6c48f47249d135ee29280652ec250178e26fbc87d75f454054d63189aeff

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page