0

我有一个 Django 项目,其中包含两个应用程序,费用和销售,它们都有名为 Item 的模型。我正在使用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)')

管理员.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

发生的事情是在大多数情况下会生成通道类,并且也会生成它的名称。但是,您可以避免通道类生成和通道名称生成(希望如此,否则这真的很糟糕)。

注册表文档

三种情况是可能的:

  • 指定模型类和 ModelNameChannel 将生成扩展 ChannelBase,属性 model=model
  • 指定一个model和一个没有model属性的channel类,会生成一个ModelNameChannel,属性model=model
  • 指定带有model属性的channel类,直接注册channel

避免通道类生成的解决方案是在第三种情况下:使用模型属性注册模型和通道类

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 回答