2016-06-18 2 views
0

내가 호출 장고 모델장고 모델 인스턴스의 사용자 정의 방법

class Post(models.Model): 
    author = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True) 
    title = models.CharField(max_length=200) 
    text = MarkdownField() 
    slug = models.SlugField(unique=True, blank=True) 
    created = models.DateTimeField(auto_now_add=True) 
    published_date = models.DateTimeField(blank=True, null=True) 

    def generate_unique_slug(self): 
     slug = self._meta.get_field('slug') 
     max_length = slug.max_length 
     slug = orig = slugify(self.title)[:max_length] 

     for x in itertools.count(1): 
      if not Post.objects.filter(slug=slug).exists(): 
       break 

      # Truncate the original slug dynamically. Minus 1 for the hyphen. 
      slug = "%s-%d" % (orig[:max_length - len(str(x)) - 1], x) 

    def publish(self): 
     self.published_date = timezone.now() 
     self.generate_unique_slug() 
     self.save() 

에서 사용자 정의 방법을 통합하기 위해 노력하고있어 "게시", "generate_unique_slug"는 작동하지 않습니다. 예를 들어, 내가 터미널

>>> p = Post(title="Title Example", text="Text example") 
>>> p.publish() 
>>> p.title 
'Title Example' 
>>> p.published_date 
datetime.datetime(2016, 6, 18, 14, 45, 12, 710452, tzinfo=<UTC>) 
>>> p.slug 
u'' 

에서이 작업을 수행 할 수 있습니다 나는이

>>> p.generate_unique_slug() 
>>> p.slug 
u'' 

내가 뭘 잘못 시도했습니다?

답변

1

모델의 slug을 업데이트하지 않습니다.

def generate_unique_slug(self): 
    # your code 
    self.slug = slug 
+0

그건 고마워! 어쨌든, 관리자 패널에서 포스트를 만들면 슬러그가 생성되지 않습니다. 어떻게 생각합니까? –

+1

게시 기능을 실행할 때만 슬러그가 생성됩니다. 문제가있는 곳입니까? 그렇다면 save 메소드를 대체하려고 할 것입니다. –

+1

새로운'Post'를 만들 때 메서드가 호출되지 않기 때문입니다. 모델의 save 메소드를 수정하여 항상'generate_unique_slug'를 호출 할 수 있습니다. [this] (http://stackoverflow.com/questions/4269605/django-override-save-for-model) –

0

generate_unique_slug을 둘 인스턴스의 속성을 변경하거나 아무것도 반환 : generate_unique_slug의 말에 self.slug = slug를 추가하지 않습니다.

slugslug = "%s-%d" % (orig[:max_length - len(str(x)) - 1], x)에서 self.slug = ...으로 변경해야합니다.

0

이 답변은 코드를 수정하지 못하지만 여러 경우를 다루기 때문에 좋은 옵션이라고 생각합니다.

정확히 이것을 수행하도록 설계된 uuslug 라이브러리가 있습니다. 체크 아웃 할만한 가치가 있을지도 모릅니다.

저장소에서 예 :

from django.db import models 
from uuslug import uuslug 

# Override your object's save method with something like this (models.py) 
class CoolSlug(models.Model): 
    name = models.CharField(max_length=100) 
    slug = models.CharField(max_length=200) 

    def __unicode__(self): 
     return self.name 

    def save(self, *args, **kwargs): 
     self.slug = uuslug(self.name, instance=self) 
     super(CoolSlug, self).save(*args, **kwargs) 

name = "john" 
c = CoolSlug.objects.create(name=name) 
c.save() 
print(c.slug) # => "john" 

c1 = CoolSlug.objects.create(name=name) 
c1.save() 
print(c1.slug) # => "john-1" 

나는 또한 당신이 slug = models.SlugField(max_length=200)slug = models.CharField(max_length=200)을 변경할 수 있습니다 믿고, 여전히 제대로 작동합니다. 코멘트 후

편집 :

대신 최우선 save, 당신이 할 수있는 다음

from uuslug import slugify 

class Post(models.Model): 
    author = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True) 
    title = models.CharField(max_length=200) 
    text = MarkdownField() 
    slug = models.SlugField(unique=True, blank=True) 
    created = models.DateTimeField(auto_now_add=True) 
    published_date = models.DateTimeField(blank=True, null=True) 


    def publish(self): 
     self.published_date = timezone.now() 
     self.slug = slugify(self.title, max_length=self._meta.get_field('slug')) 
     self.save() 

이이 문제를 해결합니까?

+0

어쨌든 라이브러리를 주셔서 감사합니다. 슬러그 라인이 "슬러그 = models.SlugField (유일한 = 참, 공백 = 참)"입니다. :) –

+0

답변을 업데이트했습니다. –