自动完成灯光频道名称冲突

2024-10-01 22:39:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Django项目包含两个应用程序,费用和销售,这两个应用程序的模型都命名为Item。我使用django自动完成灯来简化项目的选择。这取决于我最后注册的频道的费用或销售额,但另一个频道错误地显示了相同的项目。在

自动完成指示灯_注册表.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

对于销售应用程序,费用类似

^{pr2}$

在使用自动完成字段检查日志时,我看到从两个视图中获取的是同一个url。在

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

如何配置此so列表销售项目在管理销售视图和列表中返回费用.项目是否在“管理费用”视图中返回?在


Tags: 项目self视图应用程序getiffilteritem
1条回答
网友
1楼 · 发布于 2024-10-01 22:39:50

在大多数情况下,channel类是生成的,它的名称也是生成的。但是,您可以避免生成通道类和生成通道名(希望如此,这样做真的很糟糕)。在

registry documentation

Three cases are possible:

  • specify model class and ModelNameChannel will be generated extending ChannelBase, with attribute model=model
  • specify a model and a channel class that does not have a model attribute, and a ModelNameChannel will be generated, with attribute model=model
  • specify a channel class with a model attribute, and the channel is directly registered

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

自动完成指示灯_注册表.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()实现似乎与默认实现相同。。。在

相关问题 更多 >

    热门问题