在给定urlconf的情况下,根据其absolute_url查找对象

时间:2012-07-28 17:58:40

标签: django django-models django-views django-urls

我在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对象的实例?

我是新来的。谢谢你的帮助!

1 个答案:

答案 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本身已经足够了,因为它是独一无二的,你根本不需要拥有者:但这取决于你自己决定。