遵循此answer,我能够过滤外键选择以进行选择:

django - 如何在Django ModelAdmin.autocomplete_fields中限制外键对象用于自动完成搜索结果?-LMLPHP

但是,当我将spm标记为autocomplete_field:autocomplete_fields = ['spm']时,spm字段将从选择字段变为自动完成搜索字段:
django - 如何在Django ModelAdmin.autocomplete_fields中限制外键对象用于自动完成搜索结果?-LMLPHP

但是,外键选择不再受“ formfield_for_foreignkey”中配置的限制。

即使我将小部件附加在formfield_for_foreignkey方法内,spm自动完成选项也受到限制:

@admin.register(CustomModel)
class CustomModelAdmin(admin.ModelAdmin):

    #autocomplete_fields = ['spm']
    search_fields = ['name']

    def get_form(self, request, obj=None, **kwargs):
        request.current_object = obj
        return super(CustomModelAdmin, self).get_form(request, obj, **kwargs)

    def formfield_for_foreignkey(self, db_field, request, **kwargs):

        if db_field.name == 'spm':
            instance = request.current_object
            if instance.brand and instance.memory_size:
                    filtered_qs=StandardProductWithMemorySize.objects.filter(
                        product__brand=instance.brand,
                        memory_size=instance.memory_size
                    )
                    kwargs['queryset'] = filtered_qs
                    db = kwargs.get('using')
                    kwargs['widget'] = AutocompleteSelect(db_field.remote_field, self.admin_site)
        return super(
            CustomModelAdmin, self
        ).formfield_for_foreignkey(db_field, request, **kwargs)

最佳答案

替代使用autocomplete_fields = ['spm'],而不是使用change_form.html模板,并使用JavaScript使HTML select元素可搜索(具有自动完成功能)对我有用:

django - 如何在Django ModelAdmin.autocomplete_fields中限制外键对象用于自动完成搜索结果?-LMLPHP

change_form.html的内容:

{% extends 'admin/change_form.html' %}

{% block admin_change_form_document_ready %}
    {{ block.super }}
    <script src="https://code.jquery.com/jquery-2.1.1.min.js" type="text/javascript"></script>
    <link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.1/css/select2.min.css" rel="stylesheet"/>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.1/js/select2.min.js"></script>
    <script type="text/javascript">
            $("#id_spm").select2({});
    </script>

{% endblock %}


select2函数在其上运行的HTML select元素:

<select name="spm" required="" id="id_spm" >
  <option value="" selected="">---------</option>
  <option value="67688">apple iphone 7</option>
  <option value="69093">apple iphone 7 plus</option>
  <option value="71453">apple ipad pro</option>
  <option value="71076">apple ipad pro 9.7</option>
  <option value="34840">apple ipad pro 10.5</option>
  <option value="72303">apple iphone 8 plus</option>
  <option value="72301">apple iphone 8</option>
  <option value="72307">apple iphone x</option>
  <option value="71243">apple ipad pro 12.9</option>
</select>

08-20 02:22