重写导入的类变量Django/python

2024-09-28 23:45:02 发布

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

我需要重写变量(或传递动态数据)到导入的类。你知道吗

你知道吗过滤器.py你知道吗

import django_filters
from .models import Gate, Tram, OperationArea, Bogie
from distutils.util import strtobool
from django import forms


class GateFilter(django_filters.FilterSet):

    # Prepare dynamic lists with choices
    tram_list = [(id, number) for id, number in Tram.objects.all().values_list('id', 'number')]
    bogie_list = [(id, number) for id, number in Bogie.objects.all().values_list('id', 'number')]
    area_list = [(id, area) for id, area in OperationArea.objects.all().values_list('id', 'area')]
    # Generate fields
    tram = django_filters.MultipleChoiceFilter(choices=tram_list, label=u'Tramwaj')
    car = django_filters.MultipleChoiceFilter(choices=Gate.CAR_SYMBOLS, label=u'Człon')
    bogie = django_filters.MultipleChoiceFilter(choices=bogie_list, label=u'Wózek')
    bogie_type = django_filters.MultipleChoiceFilter(choices=Gate.BOGIE_TYPES, label=u'Typ wózka')
    area = django_filters.MultipleChoiceFilter(choices=area_list, label=u'Obszar')
    operation_no = django_filters.CharFilter(label=u'Numer operacji', widget=forms.TextInput(attrs={'size': '16px'}))
    status = django_filters.MultipleChoiceFilter(choices=Gate.GATE_STATUSES, label=u'Status')
    rating = django_filters.MultipleChoiceFilter(choices=Gate.GATE_GRADES, label=u'Ocena')

    class Meta:
        pass

你知道吗视图.py你知道吗

from .filters import GateFilter

class GateListView(generic.ListView):

    queryset = None
    gate_type = None
    template_name = 'qapp/gate/list.html'
    context_object_name = 'gate_list'
    paginate_by = 20

    def get_queryset(self):
        # Type is stored in database as big-letter word, so 'bjc' != 'BJC'.
        if self.gate_type.upper() == 'BJW':
            ordering = ['bogie', 'bogie_type']
        else:
            ordering = ['tram', 'car']
        queryset = Gate.objects.filter(type=self.gate_type.upper()).order_by(*ordering)
        self.gate_list = GateFilter(self.request.GET, queryset=queryset)
        return self.gate_list.qs.distinct()

    def get_context_data(self, **kwargs):
        context = super(GateListView, self).get_context_data(**kwargs)
        # Return Gate.type to template.
        context['gate_type'] = self.gate_type
        # Return object (for generating form) to template.
        context['gate_list_filter'] = self.gate_list
        return context

如您所见,在过滤器.py,变量tram\u list,转向架列表区域列表的数据是动态的(从数据库获取)。你知道吗

但是在将这个类导入到视图.py,此数据将变为静态。你知道吗

我试图覆盖以下值:

  • 在类GateFilter中使用@classmethod decorator,并调用它 设置前self.gate\u列表对象
  • 视图.py使用GateFilter.tram\u列表(以及其他)符号

运气不好。你知道吗

由于导入类型(from.filters import GateFilter),我无法使用reload()函数。你知道吗

当前用于更新过滤器.py我需要重新运行整个应用程序。 这对于我的应用程序的业务逻辑来说是不可接受的。你知道吗


Tags: djangopyimportselfidtypecontextfilters
1条回答
网友
1楼 · 发布于 2024-09-28 23:45:02

这是错误的方法。相反,您应该使用了解查询集并在需要时对其进行评估的过滤器:ModelChoiceFilter和ModelMultipleChoiceFilter。你知道吗

class GateFilter(django_filters.FilterSet):
    team = django_filters.ModelMultipleChoiceFilter(queryset=Tram.objects.all())

相关问题 更多 >