Django Admin中自动生成的Slugs

时间:2017-02-22 20:06:28

标签: django django-models django-templates django-views django-admin

我有一个应用程序,有一天会允许前端crud,这将创建与slugify的slug。现在,所有对象创建都在管理区域完成,我想知道在管理员创建和保存对象时是否有自动生成slu的方法?

这是前端击球的方法;不确定它是否相关。谢谢。

def create_slug(instance, new_slug=None):
    slug = slugify(instance.title)
    if new_slug is not None:
        slug = new_slug
    qs = Veteran.objects.filter(slug=slug).order_by('-id')
    exists = qs.exists()
    if exists:
        new_slug = '%s-%s' % (slug, qs.first().id)
        return create_slug(instance, new_slug=new_slug)
    return slug

2 个答案:

答案 0 :(得分:2)

刚刚在另一个答案中使用了这个,我在剪贴板中有完全正确的代码。我为我的一个模特做了这个:

from django.utils.text import slugify
class Event(models.Model):

    date = models.DateField()
    location_title = models.TextField()
    location_code = models.TextField(blank=True, null=True)
    picture_url = models.URLField(blank=True, null=True, max_length=250)
    event_url = models.SlugField(unique=True, max_length=250)

    def __str__(self):
        return self.event_url + " " + str(self.date)

    def save(self, *args, **kwargs):
        self.event_url = slugify(self.location_title+str(self.date))
        super(Event, self).save(*args, **kwargs)

答案 1 :(得分:0)

以上解决方案在Django Admin界面中断开验证。我建议:



from django import forms
from django.http.request import QueryDict
from django.utils.text import slugify

from .models import Article


class ArticleForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super(ArticleForm, self).__init__(*args, **kwargs)

        # Ensure that data is a regular Python dictionary so we can
        # modify it later.
        if isinstance(self.data, QueryDict):
            self.data = self.data.copy()

        # We assume here that the slug is only generated once, when
        # saving the object. Since they are used in URLs they should
        # not change when valid.
        if not self.instance.pk and self.data.get('title'):
            self.data['slug'] = slugify(self.data['title'])

    class Meta:
        model = Article
        exclude = []