Как создать пул в 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",)}
Ответ 9
Вы можете посмотреть документы для SlugField
чтобы узнать больше об этом более SlugField
.