Django: изменение строк в зависимости от выбора - PullRequest
2 голосов
/ 28 июня 2011

Категория имеет «типы» (например, три типа категорий). Каждая категория может иметь любое количество видео. И каждое видео, опубликованное в категории типа «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 Ответ

2 голосов
/ 28 июня 2011

Просто используйте JavaScript для динамического скрытия / показа встроенного набора.Идентификатор встроенного набора всегда #[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 и изменить URL в вызове AJAX, чтобы он соответствовал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...