0

Item という名前のモデルを持つ Expenses と Sales の 2 つのアプリを含む Django プロジェクトがあります。項目の選択を容易にするためにdjango-autocomplete-lightを使用しています。これは、最後に登録したチャネルに応じて経費または売上のいずれかで機能しますが、他のチャネルには同じアイテムが誤って表示されます。

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)

オートコンプリート フィールドを使用しているときにログを確認すると、両方のビューから同じ URL が取得されていることがわかります。

"GET /autocomplete/channel/ItemChannel/?q= HTTP/1.1" 200 1416

売上のリストが管理売上ビューに返され、経費のリストが返されるように構成するにはどうすればよいですか。項目は管理経費ビューに返されますか?

4

1 に答える 1

1

ほとんどの場合、チャネル クラスが生成され、その名前も生成されます。ただし、チャネル クラスの生成とチャネル名の生成は回避できます (うまくいけば、そうしないと本当にうまくいきません)。

レジストリのドキュメントから:

次の 3 つのケースが考えられます。

  • モデル クラスを指定すると、ModelNameChannel が生成され、属性 model=model で ChannelBase を拡張します
  • モデル属性を持たないモデルとチャネル クラスを指定すると、ModelNameChannel が属性 model=model で生成されます
  • モデル属性でチャネル クラスを指定し、チャネルを直接登録する

チャネル クラスの生成を回避する解決策は、モデルとチャネル クラスをモデル属性に登録する3 番目のケースにあります。

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() 実装はデフォルトの実装と同じようです...

于 2012-06-04T12:40:11.160 に答える