我正在使用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
所以我弄明白了,我传递的是植物编号而不是id,这正是django所期望的,因为我的过滤器与Sightings模型相反,plant_number是Sightings模型中的外键。有效的代码:
这是因为
FILTER_CHOICES
是元组中的元组,而不是列表中的元组。试试这个:相关问题 更多 >
编程相关推荐