Как создать пул в Django?

Я пытаюсь создать SlugField в Django.

Я создал эту простую модель:

from django.db import models

class Test(models.Model):
    q = models.CharField(max_length=30)
    s = models.SlugField()

Затем я делаю это:

>>> from mysite.books.models import Test
>>> t=Test(q="aa a a a", s="b b b b")
>>> t.s
'b b b b'
>>> t.save()
>>> t.s
'b b b b'

Я ожидал bbbb.

Ответ 1

Вам нужно будет использовать функцию slugify.

>>> from django.template.defaultfilters import slugify
>>> slugify("b b b b")
u'b-b-b-b'
>>>

Вы можете вызвать slugify автоматически, переопределив метод save:

class Test(models.Model):
    q = models.CharField(max_length=30)
    s = models.SlugField()

    def save(self, *args, **kwargs):
        self.s = slugify(self.q)
        super(Test, self).save(*args, **kwargs)

Имейте в виду, что вышеизложенное приведет к изменению вашего URL при редактировании поля q, что может привести к неработающим ссылкам. Может быть предпочтительнее генерировать слаг только один раз при создании нового объекта:

class Test(models.Model):
    q = models.CharField(max_length=30)
    s = models.SlugField()

    def save(self, *args, **kwargs):
        if not self.id:
            # Newly created object, so set slug
            self.s = slugify(self.q)

        super(Test, self).save(*args, **kwargs)

Ответ 2

Существует угловой регистр с некоторыми символами utf-8

Пример:

>>> from django.template.defaultfilters import slugify
>>> slugify(u"test ąęśćółń")
u'test-aescon' # there is no "l"

Это можно решить с помощью Unidecode

>>> from unidecode import unidecode
>>> from django.template.defaultfilters import slugify
>>> slugify(unidecode(u"test ąęśćółń"))
u'test-aescoln'

Ответ 3

Небольшая поправка на ответ Thepeer: Чтобы переопределить функцию save() в классах моделей, лучше добавьте к ней аргументы:

from django.utils.text import slugify

def save(self, *args, **kwargs):
    if not self.id:
        self.s = slugify(self.q)

    super(test, self).save(*args, **kwargs)

В противном случае test.objects.create(q="blah blah blah") приведет к ошибке force_insert (неожиданный аргумент).

Ответ 4

Если вы используете интерфейс администратора для добавления новых элементов своей модели, вы можете настроить ModelAdmin в своем admin.py и использовать prepopulated_fields для автоматизации ввода пули:

class ClientAdmin(admin.ModelAdmin):
    prepopulated_fields = {'slug': ('name',)}

admin.site.register(Client, ClientAdmin)

Здесь, когда пользователь вводит значение в форме администратора для поля name, slug будет автоматически заполнен правильным slugified name.

Ответ 5

В большинстве случаев slug не должен меняться, поэтому вы действительно хотите только вычислить его при первом сохранении:

class Test(models.Model):
    q = models.CharField(max_length=30)
    s = models.SlugField(editable=False) # hide from admin

    def save(self):
        if not self.id:
            self.s = slugify(self.q)

        super(Test, self).save()

Ответ 6

Если вы не хотите, чтобы slugfield не редактировался, я полагаю, вы захотите установить свойства Null и Blank в значение False. В противном случае вы получите сообщение об ошибке при попытке сохранить в Admin.

Таким образом, модификация приведенного выше примера будет:

class test(models.Model):
    q = models.CharField(max_length=30)
    s = models.SlugField(null=True, blank=True) # Allow blank submission in admin.

    def save(self):
        if not self.id:
            self.s = slugify(self.q)

        super(test, self).save()

Ответ 7

Используйте prepopulated_fields в вашем классе администратора:

class ArticleAdmin(admin.ModelAdmin):
    prepopulated_fields = {"slug": ("title",)}

admin.site.register(Article, ArticleAdmin)

Ответ 8

Я использую Django 1.7

Создайте SlugField в вашей модели следующим образом:

slug = models.SlugField()

Затем в admin.py определите prepopulated_fields;

class ArticleAdmin(admin.ModelAdmin):
    prepopulated_fields = {"slug": ("title",)}