2

Django-Admin에서 모델 필드에 list_filter를 정의 할 수 있습니다. 이것은 ManyToMany-Fields에서도 작동합니다.Django Admin change_list 다중 ManyToMany 필터링

class ModelA(models.Model): 
    name = models.CharField(max_length=100, verbose_name="Name") 

class ModelB(models.Model): 
    model_a_relation = models.ManyToManyField(ModelA) 

class ModelBAdmin(ModelAdmin): 
    list_filter = [model_a_relation, ] 

admin.site.register(ModelB, ModelBAdmin) 

지금, 나는 ModelB의 관리자 object_list에서 MODELA과 관련하여 ModelB의 요소 내 목록을 필터링 할 수 있습니다.

이제 내 질문 : ModelA의 여러 개체로 필터링 할 수 있습니까?

ModelB의 change_view에서 django-autocomplete-light를 사용하여 관계를 정의합니다. 이 위젯을 사용하여 change_list에서도 필터링 할 수 있습니까?

ModelB.objects.filter(model_a_relation__in=names)과 같은이 필터의 백그라운드에서 쿼리를 상상해보십시오. 여기서 names는 ModelA의 선택한 개체 목록입니다.

감사합니다, 호르스트

답변

3

내 문제를 해결하기 위해 정말 더러운 시도를했습니다. 그것은 효과가 있으며 나는 당신과 그것을 나누고 싶습니다.

는 더 나은 이해를 위해 나는이 예제에서 새로운 모델을 사용

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 구멍을 제거합니다.

+0

django-autocomplete-light가 changelist 필터에서 자동 완성 지원을 제공하는 경우 정말 멋지 더군요! – jpic

+0

대단히 감사합니다! 이것이 바로 SimpleListFilter 인터페이스에서 누락 된 부분입니다. – Moritz

0

또 다른 옵션은 사용자가 변경 목록보기에서 자동 완성을 사용할 수 있도록 :

  • 설치 ModelAdmin.search_fields을 즉, 자동 완성,에서 제공하는 필드에서 검색 할 수 있습니다.

    class ModelBAdmin(ModelAdmin): 
        search_fields = ['model_a_relation__name'] 
    
  • override the changelist tomplatespawn an autocomplete on the search input에 :

    <script type="text/javascript"> 
    $(document).ready(function() { 
        $('#searchbar').yourlabsAutocomplete({ 
         url: '{% url 'autocomplete_light_autocomplete' 'YourAutocompleteName' %}', 
         choiceSelector: '[data-value]', 
        }).input.bind('selectChoice', function(e, choice, autocomplete) { 
         $(this).val(choice.text()) 
           .parents('form').submit(); 
        }); 
    }); 
    </script> 
    
  • 이 스크립트를 추가 한 후 더 JS 오류가 없는지 확인!

+0

정말로 감사드립니다.하지만 자동 완성에 집중하고 싶지는 않지만 필터링을 위해 여러 항목을 선택할 수 있습니다. 또한 ModelB의 다른 속성에 대해 이미 자동 완성 기능을 갖춘 검색 창을 사용하고 있으며 이러한 새로운 기능과 혼합되기를 원하지 않습니다. 오른쪽 필터 영역에서 자동 완성 위젯을 사용하려고 생각했습니다. –