在Django Admin的“添加/更改”页面的下拉菜单中选择相关的外键值

时间:2018-08-24 13:03:07

标签: django django-admin

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)时,Doctor下拉菜单会显示所有Doctors,但我只想与选择的相册相关的唯一一个医生

我尝试了https://github.com/BranchMetrics/xamarin-branch-deep-linking/tree/master/Examples,但没有成功。 而且,我在VideoAdmin(admin.ModelAdmin,ExportCsvMixin)类下添加了autocomplete_fields = ['doc'],它也无法正常工作。

有人可以帮我吗?非常非常感谢!

1 个答案:

答案 0 :(得分:1)

我找到了一种方法,该方法可以覆盖Admin的change_form.html来添加一些jQuery代码来实现它。

/PROJECT_DIR/templates/admin/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作为管理员替代品。