在Django中,一旦我进入视图,如何处理url正则表达式中的“或”?

时间:2011-08-08 02:52:34

标签: django django-urls

我只是在学习Django,并且遇到了一些网址逻辑。我正在尝试在网址中允许类别名称或ID:

...
url(r'^(?P<booze_q>\w+|\d+)/$','glasses.views.booze'),
...

然后在视图中,只处理一次该结果。但是,如果url是一个字符串 - 在本例中为Whiskey,则在尝试传递期望int的字符串时会出错。这是我到目前为止最接近的:

def booze(request, booze_q):
    booze = get_object_or_404(Booze,Q(pk=booze_q)|Q(name=booze_q))
    return render_to_response('booze/detail.html', {'booze': booze})

但是这会返回错误:invalid literal for int() with base 10: 'Whiskey'

我确信这是一件非常简单的事情,但这是我的第一个Django应用程序,所以任何帮助都会受到赞赏。

tl; dr :最终结果,我希望mysite.com/1/mysite.com/Whiskey/同时调用glasses.views.booze视图,并使用{{获取对象1}}或id=1

2 个答案:

答案 0 :(得分:1)

这是您经常遇到的常见情况,通常通过诉诸多个参数来处理,并且视图的行为会根据随后存在的视图参数而有所不同。

您要做的是首先定义一个唯一匹配每个特定案例的URL模式,然后让Django的URL解析器根据匹配的模式相应地设置参数。

以下是基于类视图的示例,该视图根据设置的booze_idbooze_name两个关键字参数执行两个不同的查询:

url(r'^(?P<booze_id>\d+)/$', BoozeDetailView.as_view()),
url(r'^(?P<booze_name>\w+)/$', BoozeDetailView.as_view()),

class BoozeDetailView(DetailView):

    model = Booze

    def get_object(self):
        booze_id = self.kwargs.get('booze_id', None)
        booze_name = self.kwargs.get('booze_name', None)

        if booze_id:
            return self.model.objects.get(id=booze_id)
        else:
            return self.model.objects.get(name=booze_name)

答案 1 :(得分:0)

即使字符串包含数字,您也总是会得到一个字符串。

1)你应该有一个参数可以是id或其他东西。有一天,您将输入一个名称为数字的项目,您的应用程序将失败。

2)当用字符串查询pk时,django会自动尝试将其转换为整数。在构造该查询之前,您必须处理非pk案例。