我在model.py中定义了以下get_absolute_url:
class Product(models.Model):
def get_absolute_url(self):
return "/products/category/type/%d%s%d" % (self.owner.id,
self.owner, self.id)
我在urls.py中定义了以下urlconf:
url(r'^products/category/type/(\w+)(\w+)(\w+)/$', 'detail'),
在views.py中的'detail'方法中,如何使用get_absolute_url引用Product对象的实例?
我是新来的。谢谢你的帮助!
答案 0 :(得分:1)
我猜你真正想做的只是在detail
视图中获取相关对象。
但首先,请注意警告:您的网址非常奇怪,并且不会为您提供您期望的结果。所有者ID,所有者和ID的值之间没有区分,因此正则表达式将始终将所有字符分配到最后两个作为所有者ID,并将每个字符分配给所有者和ID。例如,如果您的网址为products/category/type/1daniel34/
,则不会将其解析为('1', 'daniel', '34')
,而是始终将其解析为('1daniel', '3', '4')
。您应该在要捕获的每个元素之间加上斜杠,使用\d
代替\w
来匹配数字,并使用命名组:
^products/category/type/(?P<owner_id>\d+)/(?P<owner>\w+)/(?P<id>\d+)/$
(另外,您应该考虑使用the permalink
decorator来生成绝对URL,而不是从urlconf中重现整个字符串。)
现在,视图的一点是它传递了从URL conf中捕获的值。所以你对绝对URL的引用令人困惑:没有理由关心get_absolute_url产生的值,你只需要使用你在视图中传递的值来查询数据库。在这种情况下,您的视图将如下所示:
def detail(owner_id, owner, id):
product = Product.objects.get(id=id, owner_id=owner_id)
...etc...
请注意,我遗漏了对owner
的引用,因为所有者ID似乎足以识别该对象。事实上,我会说id本身已经足够了,因为它是独一无二的,你根本不需要拥有者:但这取决于你自己决定。