Ashish
Ashish

Reputation: 429

using foreign language in django slug field is not working

this question might get a bit large,i will try to explain perrty much everything whats going on.below is my heading model which fills the slug field itself by whatever is the title:

class Heading(models.Model):
    category = models.ForeignKey(Category)
    title = models.CharField(max_length=5000)
    content =RichTextUploadingField ()
    image= models.ImageField(null=True,blank=True)
    date = models.DateField(default=datetime.now())
    time = models.TimeField(default=datetime.now())
    slug = models.SlugField(unique=True, null=True, blank=True)

    def save(self, *args, **kwargs):
        self.slug = slugify(self.title)
        super(Heading, self).save(*args, **kwargs)

my title is in a foreign language(nepali language to be specific) below is the image of my admin panel to fill up the heading class headingclass

as you can see my title is in foreign language but my slug field is filled automatically by converting that title in english language which is not what i want,i want my slug field to be filled in the same language as my title field.i did some search and a module called unidecode might be the solution to it,i tried using it too but since its documentation is not well i couldn't get hook of it.so if there is any other solution or how to make proper use of unidecode?any kind of help or clue would be greatly appreciated

Upvotes: 3

Views: 983

Answers (2)

Anish Var Shrestha
Anish Var Shrestha

Reputation: 29

Firstly you have to import "SLUGIFY" [from django.utils.text import slugify]. Secondly, In model,

slug = models.SlugField(allow_unicode=True, unique=True, null=True, blank=True)

After that:

def save(self, *args, **kwargs):
 self.slug = slugify(self.title)
 if not self.slug:
  slug_str = f"{self.title}"
  self.slug = slugify(slug_str, allow_unicode=True)
 super(Blog, self).save(*args, **kwargs)

Finally Don't forget to add

[ALLOW_UNICODE_SLUGS = True]

in settings.py.

Upvotes: 2

koniiiik
koniiiik

Reputation: 4392

The problem is, slugification happens in JavaScript (at least in the standard Django admin), before it reaches the server (you can look up urlify.js in the admin contrib package).

There's a new option on SlugField called allow_unicode, which might do what you want, but it's been introduced in Django 1.9.

If you cannot upgrade to 1.9 yet, you could in theory set up some endpoint on your server that would take a string, run unidecode on it, and return it, and then cook up some custom JavaScript code that would override the default slugification in the admin, but that sounds like quite a lot of work.

Another option would be to hide the slug field from the admin altogether, and do something similar to that snippet of code you posted in your question, except you should probably do this in the ModelAdmin class instead of the model itself (and you probably want to use unidecode there before passing the string to slugify).

Upvotes: 1

Related Questions