【问题标题】:Django how the urls are resolved?Django如何解析网址?
【发布时间】:2013-05-02 23:35:33
【问题描述】:

我正在查看一个示例 DJango 代码并试图了解这些 url 是如何解析的?

list.html

类别

{% for c in active_categories %}
    <a href="{{c.get_absolute_url}}">{{c.name}}</a><br />
{% endfor %}

urls.py

from django.conf.urls import *

urlpatterns = patterns('ecomstore.catalog.views',
            (r'^$','index',{'template_name':'catalog/index.html'},'catalog_home'),
            (r'^category/(?P<category_slug>[-\w]+)/$','show_category',{'template_name':'catalog/category.html'},'catalog_category'),
            (r'^product/(?P<product_slug>[-\w]+)/$','show_product',{'template_name':'catalog/product.html'},'catalog_product'),
            )

上面的html列出了所有没有任何问题的类别,当我在浏览器中输入以下内容时调用它..[http:127.0.0.1:8000]

当我将鼠标悬停在 -a href="{{p.get_absolute_url}} 上时 - 我将 url 解析为--[http://127.0.0.1:8000/category/electronics/]

p.get_absolute_url 仅解析为电子产品,但我想知道如何在 url 中解析“类别”..

models.py

class Category(models.Model):
    name = models.CharField(max_length=50)
    slug = models.SlugField(max_length=50,unique=True,help_text='Unique value for product page URL created from name')
    description = models.TextField()
    is_active = models.BooleanField(default=True)
    meta_keywords = models.CharField("Meta Keywords",max_length=255,help_text="comma-delimited set of SEO Keywords for meta tag")
    meta_description = models.CharField("Meta description",max_length=255,help_text="Content for description meta tag")
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        db_table = 'categories'
        ordering = ['-created_at']
        verbose_name_plural = 'Categories'

    def __unicode__(self):
        return self.name

    @models.permalink
    def get_absolute_url(self):
        return ('catalog_category',(),{'category_slug':self.slug})

希望我的问题很清楚......

【问题讨论】:

  • Product 对象 (models.py) 上的 get_absolute_url 方法是什么样的?

标签: django


【解决方案1】:

get_absolute_url是模型内部定义的函数(例如Category)模型如下:

class Category(models.Model):
    name = models.CharField(max_length=200)
    ...

    def get_absolute_url(self):
        return "/category/%s/" % self.slug

也可以使用reverse 函数使用urls.py 中定义的模式来解析url:

def get_absolute_url(self):
    return reverse('catalog_category', args=[str(self.slug)])

这几乎等于一个老式的形式:

@models.permalink
def get_absolute_url(self):
    return ('catalog_category', (), {'category_slug': str(self.slug)})

在这两种方式中,对 Category 对象(例如 Category(name="electronics"))调用 get_absolute_url 方法都会产生字符串:/category/electronics/

正如您在 urls.py 中看到的,第二个 url 模式名为 catalog_category,它出现在反向函数参数中。当你调用 reverse 函数时,Django 会查看 urls.py 文件,寻找一个名为 catalog_category 的模式,并将通过将 url 参数 (category_slug) 替换为 self.slug 来生成最终的 url。

【讨论】:

  • 我已经添加了models.py...是的,get_Absolute_url..获取了url..但是路径是如何解析的?
  • 哇,你确定吗? URL 必须根据模型解析为 /product/[product_slug]/。
猜你喜欢
  • 1970-01-01
  • 2022-01-16
  • 2010-11-17
  • 2011-04-05
  • 2020-10-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多