2009-08-15 2 views
1

私はprepopulated_fieldがModelAdminの外で利用可能かどうか知りたいですか?Django、prepopulated_fields

私はフィールドタイトルから値が得られるスラッグフィールドを作りたいと思っています。私の知っていることを

よろしく、 Asinox

答えて

2

ありません。 私はjavascriptとAJAXを使ってこのようなことをしました。タイトルフィールドがフォーカスを失ったとき、AJAXリクエストは、あなたのスラッグを返すあなたのアプリケーションのURLに送られます。ここにjavascriptがあります:

<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> 

これはPrototypeを使用していますが、jQueryなどと同じように簡単に使用できます。 Djangoの側では 、ここで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()方法の残りの部分を追加し、この方法は

であることを、モデルの名前です。あなたがに電話をしたときに置いてくださいは依然としてデータベースへの変更を物理的にコミットします。

明らかにこれらの変更はサーバー側でのみ行われるため、ユーザーはそれらが起こっていることを「認識」しないので、Django管理パネルの動作をエミュレートする場合(つまり、スラッグが自動的にテキストボックスslugの場合)、mazelifeのAjaxコードを組み込む必要があります。

関連する問題