Próbuję utworzyć SlugField
w Django.
Stworzyłem ten prosty model:
from django.db import models
class Test(models.Model):
q = models.CharField(max_length=30)
s = models.SlugField()
Następnie robię to:
>>> 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'
Oczekiwałem b-b-b-b
.
python
django
django-models
slug
Johnd
źródło
źródło
def save(self):
zdef save(self, *args, **kwargs):
aby uniknąć błędów z wyrzucane pisząc coś takiegotest.objects.create(q="blah blah blah")
.slugify()
można również znaleźć wdjango.utils.text.slugify
, nie jest jasne, kiedy to zostało dodane.Istnieje narożnik z niektórymi znakami utf-8
Przykład:
Można to rozwiązać za pomocą Unidecode
źródło
Mała korekta odpowiedzi Thepeera: Aby zastąpić
save()
funkcję w klasach modeli, lepiej dodaj do niej argumenty:W przeciwnym razie
test.objects.create(q="blah blah blah")
spowodujeforce_insert
błąd (nieoczekiwany argument).źródło
return super(test, self).save(*args, **kwargs)
. Myślę, że ta metoda powracaNone
i nie wiem o żadnych planach jej zmiany, ale nie szkodzi zwróceniu tego, co robi metoda nadklasy na wypadek, gdyby w przyszłości uległa zmianie.Jeśli używasz interfejsu administratora, aby dodać nowe elementy swojego modelu, możesz skonfigurować
ModelAdmin
w swoimadmin.py
i wykorzystaćprepopulated_fields
do zautomatyzowania wprowadzania ślimaka:Tutaj, gdy użytkownik wpisze wartość w formularzu administratora dla
name
pola,slug
zostanie on automatycznie wypełniony poprawnym slugifiedname
.źródło
slug
iname
pola mają tłumaczenia. Jak mogę to zrobić z tłumaczeniami? Ponieważ próbowałem dodać'slug_en':('name_en',)
błąd, ale ten atrybut nie istnieje w moim modelu.W większości przypadków ślimak nie powinien się zmienić, więc naprawdę chcesz go obliczyć tylko przy pierwszym zapisie:
źródło
Użyj
prepopulated_fields
w swojej klasie administratora:źródło
Jeśli nie chcesz ustawić slugfield na Nie można edytować, to uważam, że będziesz chciał ustawić właściwości Null i Blank na False. W przeciwnym razie wystąpi błąd podczas próby zapisania w Administratorze.
Zatem modyfikacją powyższego przykładu byłoby:
źródło
Używam Django 1.7
Utwórz SlugField w swoim modelu w następujący sposób:
Następnie
admin.py
zdefiniujprepopulated_fields
;źródło
Możesz zajrzeć do dokumentacji,
SlugField
aby dowiedzieć się więcej na ten temat w bardziej opisowy sposób.źródło