自动填充 - 光通道名称冲突

时间:2012-06-02 07:07:41

标签: python django autocomplete

我有一个包含两个应用程序,费用和销售的Django项目,它们都有名为Item的模型。我正在使用 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 / autocomplete / channel / ItemChannel /?q = HTTP / 1.1”200 1416

如何配置此列表sales.Item在Admin Sales视图中返回,并且在管理费用视图中返回.Item?

1 个答案:

答案 0 :(得分:1)

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

来自registry documentation

  

可能有三种情况:

     
      
  • 指定模型类,将生成扩展ChannelBase的ModelNameChannel,其属性为model = model
  •   
  • 指定一个没有model属性的模型和通道类,并生成一个ModelNameChannel,带有属性   模型=模型
  •   
  • 指定具有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()实现似乎与默认实现相同......