Django:根据select选项更改内联

时间:2011-06-28 12:33:23

标签: python django django-admin django-views

类别具有“类型”(例如,三种类别)。每个类别可能包含任意数量的视频。以“1”类别发布的每个视频可能包含任意数量的图片。但对于视频,以'2'和'3'类别类型发布,没有图片。

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

问题

当我添加视频项目并为其选择类别时,我如何根据我为视频选择的类别类型来显示PictureInline?

如果我在选择列表中选择第一个类别,我想在管理员中看到PictureInline,如果我选择其他类别,我不想看到PictureInline。

有可能吗?

PS :我找到https://github.com/digi604/django-smart-selects但未找到内联的此类功能

1 个答案:

答案 0 :(得分: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以匹配。