문제

class Foo(models.Model):
    title = models.CharField(max_length=20)
    slug = models.SlugField()

제목에 따라 슬러그 필드를 자동 인구 화하는 내장 방법이 있습니까? 아마도 관리자와 관리자 외부에서.

도움이 되었습니까?

해결책

Django 1.0 이상의 관리자의 경우 사용해야합니다.

prepopulated_fields = {'slug': ('title',), }

관리자

prepopulated_fields 사전의 키는 당신이 채우는 필드이며, 그 값은 당신이 연결하려는 필드의 튜플입니다.

관리자 외부에서는 사용할 수 있습니다 slugify 당신의 견해에서 기능하십시오. 템플릿에서는 사용할 수 있습니다 |slugify 필터.

이 패키지도 자동으로 처리 할 패키지도 있습니다. https://pypi.python.org/pypi/django-autoslug

다른 팁

관리자 밖에서 참조하십시오 이 장고 스 니펫. 당신의 안에 넣으십시오 .save(), 그리고 프로그래밍 방식으로 생성 된 개체와 함께 작동합니다. 다른 사람들이 말했듯이 관리자 내부에서 prepopulated_fields.

Pre-1.0의 경우 :

slug = models.SlugField(prepopulate_from=('title',))

잘 작동해야합니다

1.0의 경우 사용하십시오 Camflan 's

pre_save django 신호를 사용하여 Django 관리자 코드 외부의 슬러그를 채울 수도 있습니다. 보다 Django 신호 문서.

Ajax 슬러그 고유성 검증도 유용 할 것입니다. AS-You-Type 슬러그 고유성 검증 @ 비이성적 인 충동

autoSlug 과거에 저에게 아주 잘 작동했습니다. 관리 앱과 함께 사용해 본 적이 없지만

Gotchas와 함께 완전하고 최신 답변을 추가 할 것이라고 생각했습니다.

1. Django Admin의 자동 인구 양식

관리자의 데이터 추가 및 업데이트에 대해서만 우려하는 경우 간단히 사용할 수 있습니다. propopulated_fields 기인하다

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

admin.site.register(Article, ArticleAdmin)

2. 템플릿에서 사용자 정의 양식을 자동으로 인출합니다

양식으로 자신의 서버 렌더링 된 인터페이스를 구축 한 경우 어느 쪽을 사용하여 필드를 자동으로 인포 할 수 있습니다. | Slugify Tamplate 필터 또는 슬러지 양식을 저장할 때 유틸리티 (is_valid).

3. django-autoslug와 함께 모델 수준에서 자동 인구 구조 슬러그 필드

위의 솔루션은 해당 인터페이스 (관리자 또는 사용자 정의 양식)를 통해 데이터가 조작 될 때만 슬러그 필드 (또는 필드) 만 자동 인구를 제공합니다. API가있는 경우 관리 명령 또는 모델 수준으로 드롭 다운 해야하는 데이터를 조작하는 다른 항목이 있습니다.

Django-Autoslug 슬러그 필드를 확장하고 깔끔하게 슬러지해야 할 필드를 설정할 수있는 AutoSlugfield 필드를 제공합니다.

class Article(Model):
    title = CharField(max_length=200)
    slug = AutoSlugField(populate_from='title')

이 필드는 pre_save 및 post_save 신호를 사용하여 기능을 달성 하므로이 답변의 맨 아래에있는 gotcha 텍스트를 참조하십시오.

4. Save ()를 재정의하여 모델 레벨에서 자동 인구 구조 슬러그 필드

마지막 옵션은 기본 save () 메소드를 재정의하는 것과 관련된 직접 구현하는 것입니다.

    class Article(Model):
        title = CharField(max_length=200)
        slug = SlugField()

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

참고 : Bulk-Updates는 코드를 우회합니다 (신호 포함)

이것은 초보자가 장고에 대한 일반적인 미스 이해입니다. 먼저 pre_save 및 post_save 신호가 save ()-메소드와 직접 관련되어 있음을 알아야합니다. 둘째, Django에서 대량 업데이트를 수행하는 다양한 방법은 SQL-Layer에서 직접 작동함으로써 Save ()-방법을 우회합니다. 이것은 위의 솔루션 3 또는 4에 사용 된 예제 모델에 대해 다음을 의미합니다.

  • article.objects.all (). update (title = 'new post')는 will 아니다 기사의 슬러그를 업데이트하십시오
  • 사용 bulk_create 또는 bulk_update 기사 모델에서 아니다 기사의 슬러그를 업데이트하십시오.
  • save ()-메소드가 호출되지 않으므로 pre_save 또는 post_save 신호는 방출되지 않습니다.

대량 업데이트를 수행하고 여전히 코드 레벨 제약 조건을 활용하려면 유일한 솔루션은 객체를 하나씩 반복하고 Save ()-메소드를 호출하는 것입니다. 물론 데이터베이스에서 트리거를 사용할 수는 있지만 완전히 다른 주제이지만.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top