내 문제를 해결하기 위해 정말 더러운 시도를했습니다. 그것은 효과가 있으며 나는 당신과 그것을 나누고 싶습니다.
는 더 나은 이해를 위해 나는이 예제에서 새로운 모델을 사용
class Tag(models.Model):
name = models.CharField(max_length=100, verbose_name="Name")
class Book(models.Model):
tags = models.ManyToManyField(Tag)
read = models.BooleanField()
class BookAdmin(ModelAdmin):
list_filter = ['read', ]
admin.site.register(Book, BookAdmin)
는 처음에 나는 BookAdmin의 changelist_view
을 덮어.
def changelist_view(self, request, extra_context=None):
extra_context = extra_context if extra_context else {}
q = request.GET.copy()
tags = Tag.objects.all().values('id', 'name')
current_tags = q.get('tags__id__in', [])
tag_query = request.GET.copy()
if current_tags:
tag_query.pop('tags__id__in')
current_tags = current_tags.split(',')
all_tag = False
else:
all_tag = True
for tag in tags:
if str(tag['id']) in current_tags:
tag['selected'] = True
temp_list = list(current_tags)
temp_list.remove(str(tag['id']))
tag['tag_ids'] = ','.join(temp_list)
else:
tag['selected'] = False
tag['tag_ids'] = ','.join(current_tags)
extra_context['tag_query'] = '?' if len(tag_query.urlencode()) == 0 else '?' + tag_query.urlencode() + '&'
extra_context['all_tag'] = all_tag
extra_context['tags'] = tags
return super(BookAdmin, self).changelist_view(request, extra_context=extra_context)
자세히 알 수 있듯이 일부 태그가 선택되었는지 여부에 따라 GET을 보았습니다. 그런 다음 가능한 각 태그에 대해 새로운 GET 매개 변수를 작성합니다.
그리고 내 덮어 씌우 change_list.html
{% extends "admin/change_list.html" %}
{% block content %}
{{ block.super }}
<h3 id="custom_tag_h3"> Fancy Tag filter</h3>
<ul id="custom_tag_ul">
<li{% if all_tag %} class="selected"{% endif %}>
<a href="{{ tag_query }}">All</a>
</li>
{% for tag in tags %}
<li{% if tag.selected %} class="selected"{% endif %}>
<a href="{{ tag_query }}tags__id__in={{ tag.tag_ids }}{% if not tag.selected %}{% if tag.tag_ids %},{% endif %}{{ tag.id }}{% endif %}">{{ tag.name }}</a>
</li>
{% endfor %}
</ul>
<script type="text/javascript">
$('#changelist-filter').append($('#custom_tag_h3'));
$('#custom_tag_h3').after($('#custom_tag_ul'));
</script>
{% endblock content %}
내가 하나 이상의 옵션을 활성화 부울 read
-Filter처럼 보이는 필터가이 방법이있다. 필터를 클릭하면 새 ID가 쿼리에 추가됩니다. 이미 선택된 옵션을 클릭하면 쿼리에서 id가 제거됩니다. 을 클릭하십시오. 모두은 URL에서 tags_in
구멍을 제거합니다.
django-autocomplete-light가 changelist 필터에서 자동 완성 지원을 제공하는 경우 정말 멋지 더군요! – jpic
대단히 감사합니다! 이것이 바로 SimpleListFilter 인터페이스에서 누락 된 부분입니다. – Moritz