jav*_*ved 5 django django-admin
根据这个答案,我能够过滤外键选择:
但是当我将spm标记为autocomplete_field:时autocomplete_fields = ['spm'],spm字段从选择字段变为自动完成搜索字段:

但外键选择不再受"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)
Run Code Online (Sandbox Code Playgroud)
代替使用autocomplete_fields = ['spm'],覆盖change_form.html模板并使用 JavaScript 使 HTML 选择元素可搜索(带有自动完成功能)对我来说很有效:
内容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 %}
Run Code Online (Sandbox Code Playgroud)
函数操作的 HTML select 元素select2:
<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>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
817 次 |
| 最近记录: |