2012-06-02 61 views
0

我有一個Django項目包含兩個應用程序,費用和銷售都具有名爲項目的模型。我正在使用django-autocomplete-light來簡化Item的選擇。這適用於費用或銷售,具體取決於我最後註冊哪個渠道,但另一個渠道錯誤地顯示相同的項目。自動完成 - 輕的通道名稱衝突

autocomplete_light_registry.py

from sales.models import Item as SalesItem 
from expenses.models import Item as ExpenseItem 

class ExpenseChannel(autocomplete_light.ChannelBase): 
    def query_filter(self, results): 
     q = self.request.GET.get('q', None) 

     if q: 
      if results.model == ExpenseItem: 
       results = results.filter(
        Q(name__icontains=q) 
    return results 

class SalesChannel(autocomplete_light.ChannelBase): 
    def query_filter(self, results): 
     q = self.request.GET.get('q', None) 

     if q: 
      if results.model == SalesItem: 
       results = results.filter(
        Q(name__icontains=q) 
    return results 

autocomplete_light.register(ExpenseItem, ExpenseChannel, placeholder='Select an item (e)') 
autocomplete_light.register(SalesItem, SalesChannel, placeholder='Select an item (s)') 

admin.py

對於銷售的應用程序,在費用

import autocomplete_light 

class SalesItemInline(admin.TabularInline): 
    fields = ('item',) 
    model = SalesItem 
    form = autocomplete_light.modelform_factory(SalesItem) 

使用自動填充字段我看到,當檢查日誌相似從兩個視圖中獲取相同的網址。

「GET /自動/渠道/ ItemChannel/Q = HTTP/1.1」 200 1416

如何配置sales.Item這使列表在管理銷售視圖和列表返回costs.Item在管理費用視圖中返回?

回答

1

發生什麼事是通道類是在大多數情況下生成的,它的名字也是生成的。然而,你可以避免頻道類的生成和頻道名稱的產生(希望,或者這真的很糟糕)。

registry documentation

三種情況是可能的:

  • 指定模型類和ModelNameChannel會產生延伸ChannelBase,與屬性模型=模型
  • 指定模型和一個信道沒有模型屬性的類,並且將生成ModelNameChannel,其屬性爲 model = model
  • 指定與一個模型屬性的信道類,並且信道被直接註冊

,以避免信道類生成的解決方案是在第三情況下:註冊一個模型和信道類與模型屬性

autocomplete_light_registry.py

from sales.models import Item as SalesItem 
from expenses.models import Item as ExpenseItem 

class ExpenseChannel(autocomplete_light.ChannelBase): 
    placeholder='Select an item (e)' 
    model = ExpenseItem 

    def query_filter(self, results): 
     q = self.request.GET.get('q', None) 

     if q: 
      if results.model == ExpenseItem: 
       results = results.filter(
        Q(name__icontains=q) 
    return results 

class SalesChannel(autocomplete_light.ChannelBase): 
    model = SalesItem 
    placeholder = 'Select an item (s)' 

    def query_filter(self, results): 
     q = self.request.GET.get('q', None) 

     if q: 
      if results.model == SalesItem: 
       results = results.filter(
        Q(name__icontains=q) 
    return results 

autocomplete_light.register(ExpenseChannel) 
autocomplete_light.register(SalesChannel) 

這將工作到0.7rc2。

從0.7rc3開始(在未決問題關閉時發佈),register()有一個新的關鍵字參數channel_name,您可以使用它。

但是你應該小心你的代碼,好像你的類中的query_filter()實現和默認實現一樣...

+0

非常感謝您解釋如何做到這一點,以及在註冊時用'channel_name'添加新功能。兩種解決方案都按預期工作,我將在發佈時使用關鍵字以節省代碼行。 – maGo

+0

如果您沒有收到郵件列表中的電子郵件,它會發布:http://pypi.python.org/pypi/django-autocomplete-light/是的,channel_name功能可以在某些情況下保持代碼優雅,並且在其他一些情況下,裸註冊功能不會妨礙您的工作 – jpic