2011-06-28 14 views
2

カテゴリには「種類」(たとえば、3種類のカテゴリ)があります。各カテゴリには、任意の数の動画を含めることができます。また、「1」のカテゴリーで公開された各ビデオは、任意の数の画像を有することができる。しかし、ビデオの場合、 '2'と '3'カテゴリーのタイプにはピクチャーはありません。Django:選択オプションに基づいてインラインを変更する

models.py

class Category(models.Model): 
    title = models.CharField() 
    CHOICES = (
       ('1','1'), 
       ('2','2'), 
       ('3','3'), 
       ) 
    type = models.CharField(choices=CHOICES) 

class Video(models.Model): 
    category = models.ForeignKey(Category) 

class Picture(models.Model): 
    video = models.ForeignKey(Video) 
    title = models.Charfield() 

admin.py

class PictureInline(admin.TabularInline): 
    model = Picture 
    extra = 5 

class VideoAdmin(admin.ModelAdmin): 
    inlines = [PictureInline,] 

質問

私はビデオの項目を追加し、それには、カテゴリを選択すると、どのように私はdinamicallyどのタイプoに基づいてPictureInlineを表示することができますfビデオ用に選択されたカテゴリ?

選択リストで最初のカテゴリを選択した場合、私は管理者のPictureInlineを見たいと思っています。他のカテゴリを選択した場合、私はPictureInlineを見たくありませんでした。

可能ですか?

PS:私はhttps://github.com/digi604/django-smart-selectsが見つかりましたがインライン

答えて

2

だけで動的にインラインセットを表示/非表示にするにはJavaScriptを使用してこのような機能を見つけることができませんでした。インラインセットのIDは常に#[related_name]-groupです。

(function($){ 
    $(document).ready(function(){ 

     function togglePictureInline(selected) { 
      $.getJSON('/ajax/category-type/', { id: selected }, function (data, jqXHR) { 
       if (data[0].fields.type == 1) 
        $('#pictures-group').show(); 
       else 
        $('#pictures-group').hide(); 
      }); 
     } 

     var $category = $('#id_category'); 
     togglePictureInline($category.val()); 
     $category.change(function(){ 
      togglePictureInline($(this).val()); 
     }); 
    }); 
})(django.jQuery); 

yourapp/views.py

from django.shortcuts import get_list_or_404 
from django.core import serializers 

def ajax_category_type(request): 
    id = request.GET.get('id') 
    categories = get_list_or_404(Category, id=id) 
    data = serializers.serialize('json', categories, fields=('type',)) 
    return HttpResponse(data, mimetype='application/json') 

VideoAdminに以下を追加します。

class VideoAdmin(admin.ModelAdmin): 
    ... 
    class Media: 
     js = ('path/to/this.js',) 

かとtemplates/yourapp/video/change_form.htmlを上書き:

{% extends 'admin/change_form.html' %} 
{% block extrahead %} 
    {{ block.super }} 
    <script src="path/to/this.js" type="text/javascript"></script> 
{% endblock %} 

UPDATE:

私は、AJAXリクエストを含めるように上記のJavaScriptを変更しました。選択したカテゴリを取得する前に、選択したカテゴリを取得する必要があるため、AJAXを使用する必要があります。また、必要なデータを返すために使用できる基本ビューを追加しました。 urls.pyでビューをフックし、AJAX呼び出しのURLを一致させるだけです。

+0

ありがとうございます!これで、選択したカテゴリに応じてインラインを動的に表示/非表示できます。しかし、私が書いた質問では、インラインの見た目や消失はCategory.typeに依存します。その偉大なソリューションをアップグレードするための任意の亜種ですか?私は、どのタイプのカテゴリが選択されているかを判断するために、JS関数内でいくつかのクエリが必要であると考えます。 – Friendka

+0

上記の回答は必要なAJAX機能を含むように更新されました。 –

+0

大変ありがとう、chrisdpratt! – Friendka

関連する問題