我只是在学习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
答案 0 :(得分:1)
这是您经常遇到的常见情况,通常通过诉诸多个参数来处理,并且视图的行为会根据随后存在的视图参数而有所不同。
您要做的是首先定义一个唯一匹配每个特定案例的URL模式,然后让Django的URL解析器根据匹配的模式相应地设置参数。
以下是基于类视图的示例,该视图根据设置的booze_id
或booze_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案例。