Выберите соответствующее значение внешнего ключа в раскрывающемся меню на странице Добавить / Изменить администратора Django - PullRequest
0 голосов
/ 24 августа 2018

models.py

class Doctor(models.Model):
    name = models.CharField(max_length=255)

class Album(models.Model):
    doc = models.ForeignKey(Doctor)
    name = models.CharField(max_length=255)

class Video(models.Model):
    doc = models.ForeignKey(Doctor)
    album = models.ForeignKey(Album)
    src = models.CharField(max_length=500)

Как показано выше, на странице добавления / изменения администратора видео есть два выпадающих меню для выбора: Альбом и Доктор.

Однако, когда я выбираю альбом (например, album.id = 1 и принадлежит doctor.id = 5), в раскрывающемся меню «Доктор» отображаются все доктора, но я хочу только одного, кто связан с выбранным альбомом. .

Я пытался django-smart-select , это не сработало. И я добавляю autocomplete_fields = ['doc'] в класс VideoAdmin (admin.ModelAdmin, ExportCsvMixin), он тоже не работает.

Кто-нибудь может мне помочь? Огромное спасибо!

1 Ответ

0 голосов
/ 25 августа 2018

Я нашел способ, который переопределяет change_form.html администратора для добавления некоторого кода jQuery для его выполнения.

/ project_dir / шаблоны / администратор / APP_NAME / MODEL_NAME / change_form.html

{% extends "admin/change_form.html" %} 
{% block extrahead %}
    {{ block.super }} 
    <script>
        jQuery(document).ready(function ($) {
            $( "select#id_aid" ).change(function() {
                $.getJSON("/api/getAlbumRelatedDoc/",{id: $(this).val()}, function(j){ 
                        for (var i = 0; i < j.length; i++) { 
                            options = '<option value="' + j[i].doc + '">' + j[i].doc__name + '</option>'; 
                        }
                        $("select#id_doc").html(options); 
                        $("span#select2-id_doc-container").html(j[0].doc__name)
                }); 
            });
        });
    </script>
{% endblock %} 

/ project_dir / APP_NAME / views.py

    @api_view(['GET', 'POST'])
    def get_album_relate_doc(request): 
        id = request.GET.get('id','') 
        result = list(Album.objects.filter(id=int(id)).values('doc', 'doc__name')) 
        return HttpResponse(json.dumps(result), content_type="application/json") 

/ project_dir / APP_NAME / urls.py

path('getAlbumRelatedDoc/', views.get_album_relate_doc),

Кстати, я использую django-jet в качестве замены администратора.

...