django过滤器上的ModelChoiceFilter
我正在提高我的英语水平,请耐心点 我创建了一个django过滤器类用于我的仪表板,但是ModelChoiceField下拉列表显示了所有“colocador”对象,而不仅仅是与当前用户相关的对象 Colocador是与上的另一个用户配置文件相关的用户配置文件django过滤器上的ModelChoiceFilter,django,django-filter,Django,Django Filter,我正在提高我的英语水平,请耐心点 我创建了一个django过滤器类用于我的仪表板,但是ModelChoiceField下拉列表显示了所有“colocador”对象,而不仅仅是与当前用户相关的对象 Colocador是与上的另一个用户配置文件相关的用户配置文件 class Colocador(models.Model): user = models.OneToOneField( MyUser, on_delete=models.CASCADE, primary_key=Tr
class Colocador(models.Model):
user = models.OneToOneField(
MyUser, on_delete=models.CASCADE, primary_key=True)
work_for = models.ForeignKey(Dono, models.CASCADE, blank=True, null=True)
我有一个这样的模型
class Venda(models.Model):
name = models.CharField(max_length=50, verbose_name='Nome')
colocador = models.ForeignKey(
Colocador, on_delete=models.CASCADE, verbose_name="Colocador")
在我的过滤器里
class VendaFilter(django_filters.FilterSet):
foo
colocador = django_filters.ModelChoiceFilter(
queryset=Colocador.objects.filter(work_for=3))
class Meta:
model = Venda
fields = ['search', 'status', 'colocador']
我硬编码了work_为3,但显然我不想要硬编码的值,我已经传递了实际的用户并尝试了这个方法,但没有成功
class VendaFilter(django_filters.FilterSet):
search = django_filters.CharFilter(
method='search_filter', label='Procurar')
# colocador = django_filters.ModelChoiceFilter(
# queryset=Colocador.objects.filter(work_for=3))
class Meta:
model = Venda
fields = ['search', 'status', 'colocador']
def search_filter(self, queryset, name, value):
return Venda.objects.filter(
Q(name__icontains=value) | Q(phone_number__icontains=value) | Q(
cpf__icontains=value) | Q(rg__icontains=value), colocador__in=self.colocadores)
def __init__(self, user, *args, **kwargs):
super(VendaFilter, self).__init__(*args, **kwargs)
self.colocadores = Colocador.objects.filter(work_for=user)
self.filters['colocador'] = django_filters.ModelChoiceFilter(
queryset=Colocador.objects.filter(work_for=user))
下拉列表只显示与用户相关的对象,但当我提交过滤器时会引发此错误
raise FieldError("Cannot resolve keyword '%s' into field. "
django.core.exceptions.FieldError: Cannot resolve keyword 'None' into field. Choices are: acertado, colocador, colocador_id, cpf, expiration_date, id, mercadoria, mercadoria_id, name, phone_number, rg, sale_date, status
那么,如何创建一个正常工作的ModelChoiceFilter,并向我显示与当前用户相关的对象。如果有人有同样的问题,这里是解决方案
def __init__(self, user, *args, **kwargs):
super(VendaFilter, self).__init__(*args, **kwargs)
self.colocadores = Colocador.objects.filter(work_for=user)
self.filters['colocador'].queryset = Colocador.objects.filter(
work_for=user)
简单而美丽