Charfield에서 Slugfield를 채우는 쉬운 방법이 있습니까?
문제
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 ()-메소드를 호출하는 것입니다. 물론 데이터베이스에서 트리거를 사용할 수는 있지만 완전히 다른 주제이지만.