Django CBV - 处理URL中的可选参数

时间:2015-06-30 05:13:46

标签: django django-class-based-views

我有一个基于类的视图来列出来自特定群体的动物。有多个畜群,因此用户可以看到来自ONE畜群的所有动物,或来自所有畜群的所有动物。

我如何拥有可选的URL参数并在CBV中处理它?<​​/ p>

网址:

$( function () {
$(".owl-carousel").each(function() {
$(this).owlCarousel({
  items: 10,
  singleItem: true,
  autoPlay: true,
  stopOnHover: true,
  transitionStyle: true
 });
});

 **$( "#accordion" ).accordion({
  heightStyle: "content"
 });**
 });

我的观点:

url(r'list/(?P<hpk>[0-9]+)/$', AnimalList.as_view(), name = 'animal_list'),
url(r'list/$', AnimalList.as_view(), name = 'animal_list'),

转到类似class AnimalList(ListView): model = Animal def get_queryset(self): if self.kwargs is None: return Animal.objects.all() return Animal.objects.filter(herd = self.kwargs['hpk']) # <--- line 19 that returns an error 的网址工作正常,而/animals/list/3/失败并显示错误。这是错误:

/animals/list/

我知道KeyError at /animals/list/ 'hpk' Request Method: GET Request URL: http://localhost:8000/animals/list/ Django Version: 1.8.2 Exception Type: KeyError Exception Value: 'hpk' Exception Location: /var/www/registry/animals/views.py in get_queryset, line 19 是一个字典,当我在视图中self.kwargs时,它会显示它是空的。但我无法弄清楚如何捕捉这种情况。我觉得这是一个我错过的简单,愚蠢的错误。

2 个答案:

答案 0 :(得分:1)

我会使用GET参数而不是单独的URL来实现它。使用此方法,只有一个URL model.Edit.Countries = new SelectList(manager.GetCountries(), "Id", "Name"); 可通过参数进行过滤,例如/list/

这样更灵活,因为您最终可以添加更多查询/list/?hpk=1

/list/?hpk=1&origin=europe

答案 1 :(得分:0)

对于任何可能偶然发现并且需要答案的人来说,这是我的工作代码,在找出它之后:

class AnimalList(ListView):
  model = Animal

  def get_queryset(self):
    if 'hpk' in self.kwargs:
      return Animal.objects.filter(herd = self.kwargs['hpk'])
    return Animal.objects.all()

基本上,我们会测试hpk列表中是否存在网址参数self.kwargs。如果是,我们过滤查询集。否则,我们会归还所有动物。

希望这有助于某人:)