2

我有兩個型號:通過many2many(或外鍵)過濾器有值的很多,在Django管理(格拉佩利與否)

class TheMainThing(models.Model): 
    ... some fields ... 
    type = ManyToManyField('Type') 

class Type(models.Model): 
    ...more fields... 

我想能夠通過Types在管理過濾TheMainThings。唯一的問題是,有像100k或更多的Type對象,所以用標準的內置過濾器來做是不現實的。這是因爲所有的Types都作爲可用選項加載到瀏覽器中。 (其實,我正在使用Grappelli,但我相信它與標準的Django管理員一樣)。

有沒有* don't_reinvent_the_wheel *方法來解決這個問題?

我喜歡Grappelli在raw_id字段上的自動完成小部件,我想像這樣的東西對於這個問題是理想的......它有這樣的事情嗎?

編輯:
爲了澄清 - 的主要問題是加載時間和內存消耗的瀏覽器,而不是呈現。

+1

我會開始尋找各種django外鍵過濾解決方案;最終該視圖會收到PK列表,以便這些解決方案可以與M2M一起工作,而不會有太多麻煩。 我還沒有找到一個偉大的即插即用庫沒有調整。我對你如何解決你的問題感興趣!主演。 –

+0

@YujiTomita你說過「各種django外鍵過濾解決方案」......你有什麼特別的想法? :) – frnhr

回答

0

管理員將這些過濾器作爲鏈接與<ul>中的查詢字符串進行輸出。相反,您可以更改這些選擇。

模板中使用有admin/filter.html,它看起來像這樣:

{% load i18n %} 
<h3>{% blocktrans with filter_title=title %} By {{ filter_title }} {% endblocktrans %}</h3> 
<ul> 
{% for choice in choices %} 
    <li{% if choice.selected %} class="selected"{% endif %}> 
    <a href="{{ choice.query_string|iriencode }}">{{ choice.display }}</a></li> 
{% endfor %} 
</ul> 

您可以通過相同的名稱提供自己重寫他們的,所以也許重做這樣的:

{% load i18n %} 
<h3>{% blocktrans with filter_title=title %} By {{ filter_title }} {% endblocktrans %}</h3> 
<select> 
{% for choice in choices %} 
    <option data-href="{{ choice.query_string|iriencode }}" 
      {% if choice.selected %} selected="selected"{% endif %}> 
    {{ choice.display }} 
    </option> 
{% endfor %} 
</select> 

然後按照更改後的過濾器鏈接:

$(function() { 
    $('select', '#changelist-filter').on('change', function(e) { 
     window.location = window.location.href + $(e.target).attr('data-href'); 
    }); 

}); 

讓它走一步毛皮其次,你可以對待那些像Select2之類的東西。

+0

這是一個很好的UI調整,但我的主要問題是客戶端(瀏覽器)所需的所有可用選項的加載時間和內存,無論演示文稿(鏈接或選擇框)如何。事實上,Grappelli已經和你在這裏提出的幾乎完全一樣 - 每一個過濾器都做成了一個下拉菜單。我的問題有兩個詞:太多的選擇。 – frnhr

+0

順便說一句,謝謝關於select2的信息,似乎更好的選擇。 (一般用法)。 – frnhr

+1

啊我明白了,我完全錯過了這一點。另一個選擇是編寫一個視圖(或者可能是一個Tastypie資源),將篩選器選項作爲json返回,並在該端點指向一個select2小部件。然後,只需在「admin/filter.html」中不提供任何內容。然後,我們又回到重新發明輪子的領域。 – dokkaebi