类别具有“类型”(例如,三种类别)。每个类别可能包含任意数量的视频。以“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但未找到内联的此类功能
答案 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以匹配。