2009-08-15 1 views
1

prepopulated_field를 ModelAdmin 외부에서 사용할 수 있는지 알고 싶습니까?Django, prepopulated_fields

값을 필드 제목에서 가져 오는 슬러그 필드를 만들고 싶습니다.

감사합니다, Asinox 내가 알고하지 않는 것이

답변

2

. javascript와 AJAX를 사용하여이 작업을 수행했습니다. 제목 필드가 포커스를 잃었을 때 AJAX 요청이 슬러그를 반환하는 응용 프로그램의 URL로 전송됩니다.

<script type="text/javascript"> 
Event.observe(window, 'load', function() { 
    form = $("post_form"); 
    title = $('id_title'); 
    slug = $('id_slug'); 
    title.observe('blur', getSlug); 
}); 

function getSlug() { 
    var titleText = $F(title); 
    ajax = new Ajax.Request("/blog/utils/get-slug", { 
     'method': 'get', 
     'parameters': {'title': titleText}, 
     'onSuccess': setSlug 
    }) 

} 
function setSlug(transport) { 
    var slugText = transport.responseText; 
    slug.value = slugText 
} 
</script> 

그것은 프로토 타입 사용하지만 당신은 그냥 쉽게 jQuery를 또는 무엇이든을 사용할 수 있습니다 여기에 자바 스크립트입니다. 장고 측면에서 , 여기 Ajax 요청이 플러스 헬퍼 기능에 관한 것이다 것을보기 :

def GetSlug(request): 
    """This Django view provides a url-friendly slug based on a given post title. 
    It helps avoid primary key violations by creating different slug names 
    for posts with the same title.It is designed to be called by an AJAX 
    request from within the admin interface.""" 

    title = request.GET.get('title', None) 
    title = unquote(title) 
    if not title: 
     return HttpResponseNotFound("") 
    result = findSlug(title) 
    if not result: 
     result = "" 
    return HttpResponse(result)  

def findSlug(title): 
     title = urlify(title) 
     words = title.split('-') 
     if len(words) > 5: 
      title = "-".join(words[0:5]) 
      extraWords = words[5:] 
     else: 
      extraWords = [] 

     def testSlug(slug): 
      try: 
       Post.objects.get(slug=slug) 
      except Post.DoesNotExist: 
       return slug 
      return False 
     #if slug does not already exist, return that 
     if testSlug(title): 
      return title 
     #if title had extra words, add them one at a time and test that 
     else: 
      for word in extraWords: 
       title = title + "-" + word 
       if testSlug(title): 
        return title 
     #if we've run out of words and slug is _still_ not unique, try incrementing: title-2, title-3, etc. 
     incrementor = 2 
     while incrementor < 10: 
      tempTitle = title + "-%d" + incrementor 
      if testSlug(tempTitle): 
       return tempTitle 
     #if all else fails, punt to the user 
     return None 

def urlify(string): 
    """This takes a string (say, a post title) and convets it to something url-friendly 

    >>> title = "I read \"War & Peace\" to-day" 
    >>> urlify(title) 
    i-read-war-and-peace-to-day 

    """ 
    string = string.lower().strip() #remove leading, trailing whitespace 
    string = string.replace("&", "and") 
    string = re.sub("[^a-z0-9- ]", "", string) #remove non-alphanumeric chars (except dashes and spaces) 
    string = re.sub("\W+", "-", string) #replace whitespace with "-" 
    string = re.sub("-{2,}", "-", string) #remove double dahses 
    return string 

GetSlug보기도 경우에 유용하지만, 독특한 뭔가를 반환 정말 열심히하려고 제목이 이미 수도 다른 레코드에 존재합니다.

2

즉시 사용할 수 없지만 모델에서 save() 메서드를 무시하는 것은 매우 쉽습니다. 예 :

def save(self, *args, **kwargs): 
    # If there is not already a slug in place... 
    if not self.[name-of-slug-field]: 
     # Import django's builtin slug function 
     from django.template.defaultfilters import slugify 
     # Call this slug function on the field you want the slug to be made of 
     self.[name-of-slug-field] = slugify(self.[field-to-slugify]) 
    # Call the rest of the old save() method 
    super([model-name], self).save(*args, **kwargs) 

대괄호 안의 내용을 모델과 관련되게 변경해야합니다.

[name-of-slug-field]

실제 슬러그를 보유 모델의 필드 (예. '이 - 인 - 장타율')

[field-to-slugify] 당신이 당신의 경우에 (에서 슬러그를 구축 할 필드, 그것은 아마 것 수 title)

[model-name]이 방법은

그 코드의 마지막 줄은 내가 생각하는 유일한 잠재적으로 복잡 비트입니다에있는 모델의 이름, 그것은 그냥 오래된 save() 방법의 나머지 부분을 추가의에 전화 할 때 그렇게하십시오.은 여전히 ​​데이터베이스의 변경 사항을 실제로 커밋합니다.

분명히 이러한 변경은 서버 측에서만 이루어 지므로 사용자는 문제가 보이지 않을 것입니다. 따라서 장고 관리 패널이 어떻게 작동하는지 에뮬레이션하려면 (즉, 슬러그가 자동으로 텍스트 상자에 나타납니다 슬러그), 당신은 mazelife의 Ajax 코드를 통합해야 할 것입니다.