djang动态滤波器选择域

2024-05-29 06:17:18 发布

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

我正在使用django-filter过滤页面上的结果。我可以像这样使用静态选择过滤器:

在过滤器.py在

FILTER_CHOICES = (
('', 'All States'),
('AL', 'Alabama'),
('AK', 'Alaska'),
('AZ', 'Arizona'),
#and so forth, I am not going to list all 50 states for this a question on a forum
)


class SightingFilter(django_filters.FilterSet):
    state = django_filters.ChoiceFilter(choices=FILTER_CHOICES)
    class Meta:
        model = Sighting
        fields = ['city', 'store', 'brand', 'product', 'flavor', 'fat', 'size']   

所以上面的代码工作得很好,但是如果我试图在下面列出一个“工厂编号”这样的动态列表:

^{pr2}$

然后我得到一个错误:

以10为基数的int()的文本无效:

它在我的模板中突出显示了这段代码

{% for obj in filter %}
    <a href="/sighting/{{ obj.slug }}/ ">{{ obj.date|date:"m/d/Y" }} {{ obj.brand }} ${{ obj.price|intcomma }} </a><br />
{% endfor %}

工厂编号是模型中的CharField(工厂编号采用XX-XXX格式,其中X是数字)。在

我的观点是这样的:

def dashboard(request):
    if "Clear Filters" in request.GET:
        return redirect('/')
else:
    filter = SightingFilter(request.GET, queryset=Sighting.objects.all())
    context = {'filter': filter, 'request': request}
    return render_to_response('dashboard.html', context, context_instance=RequestContext(request))

谢谢你的帮助!在

编辑1/14/15

所以我很确定问题是工厂编号是外键(抱歉没有包括模型.py以上)。这就是为什么它需要一个int而不是一个字符串。所以现在我需要弄清楚如何获得工厂编号的外键值,而不仅仅是工厂编号。我试过了:

plant_number = django_filters.ChoiceFilter(choices=[[o.plant_number.id, o.plant_number + " " + o.Manufacturer] for o in Plant.objects.all()])

也尝试过:

plant_number = django_filters.ChoiceFilter(choices=[[o.plant_number_id, o.plant_number + " " + o.Manufacturer] for o in Plant.objects.all()])

两者都不起作用。我得到“unicode”对象在第一个对象上没有属性“id”,而“Plant”对象在第二个对象上没有属性“Plant”。在

在模型.py在

class Sighting(models.Model):
    date = models.DateField(default=today)
    brand = models.CharField(max_length=200)
    product = models.CharField(max_length=200)
    flavor = models.CharField(max_length=200)
    fat = models.DecimalField(max_digits=4, decimal_places=2)
    size = models.DecimalField(max_digits=10, decimal_places=2)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    plant_number = models.ForeignKey('Plant', blank=True, null=True )
    store = models.CharField(max_length=200)
    city =  models.CharField(max_length=200)
    state = models.CharField(max_length=200, choices=STATE_CHOICES)
    photo = ProcessedImageField(upload_to=yogurtupload,
                                   processors=[ResizeToFit(600, 600)], #Resizes so the largest dimension is 600 (width or height, whichever hits 600 first)
                                   format='JPEG',
                                   options={'quality': 72})
    slug = models.SlugField(unique=True)

    def save(self):
        now = timestamp()
        forslug = str(now) + " " + str(self.plant_number) + " " + str(self.brand)
        self.slug = slugify(forslug)
        super(Sighting, self).save()

     def __unicode__(self):
        return self.slug

class Plant(models.Model):
    plant_number = models.CharField(max_length=200)
    Manufacturer = models.CharField(max_length=200)
    city = models.CharField(max_length=200)
    state = models.CharField(max_length=200, choices=STATE_CHOICES)
    slug = models.SlugField(unique=True)

    def save(self):
        self.slug = slugify(self.plant_number)
        super(Plant, self).save()

    def __unicode__(self):
        return self.slug

Tags: djangoselfnumbermodelsrequest工厂filterlength
2条回答

所以我弄明白了,我传递的是植物编号而不是id,这正是django所期望的,因为我的过滤器与Sightings模型相反,plant_number是Sightings模型中的外键。有效的代码:

plant_number = django_filters.ChoiceFilter(choices=[[o.id, o.plant_number + " " + o.Manufacturer] for o in Plant.objects.all().order_by('IMS_plant')])

这是因为FILTER_CHOICES是元组中的元组,而不是列表中的元组。试试这个:

plant_number = django_filters.ChoiceFilter(choices=((o.plant_number.id, o.plant_number.foobar + " " + o.manufacturer_name) for o in Plant.objects.all()))

相关问题 更多 >

    热门问题