2011-06-28 33 views
2

类别具有“类型”(例如,三类类别)。每个类别可以有任意数量的视频。并且发布在类别为'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,] 

问题

当我添加视频项目,并为其选择类别,我怎样才能根据什么类型o dinamically显示PictureInline f我为视频选择了哪个类别?

如果我在选择列表中选择第一个类别,我想成为ablle在管理员中看到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 %} 

更新:

我已经更改了上面的JavaScript以包含AJAX请求。您将不得不使用AJAX,因为您必须先获取所选类别,然后才能获取它的类型。我还添加了一个基本视图,您可以使用它来返回所需的数据。您只需要将视图挂在您的urls.py中,然后在AJAX调用中更改URL以匹配。

+0

谢谢!现在我可以根据选定的类别动态显示/隐藏内联。但是我写道,内联的出现或消失取决于Category.type。任何变体升级这个伟大的解决方案?我想,我们需要JS函数内的一些查询来确定选择了哪种类型的类别。 – Friendka

+0

上面的答案已经更新,包括必要的AJAX功能。 –

+0

非常感谢,chrisdpratt! – Friendka