Django 我想知道,';类别';知道要访问哪个模型

Django 我想知道,';类别';知道要访问哪个模型,django,django-models,django-forms,django-views,django-templates,Django,Django Models,Django Forms,Django Views,Django Templates,模板代码- <a class="dropdown-item" href="{% url 'home' %}">All Products</a> {% for category in links %} <a class="dropdown-item" href="{{category.get_url}}">{{category}}</a> {% endfor %} 类别模型- class Category (models.Model

模板代码-

<a class="dropdown-item" href="{% url 'home' %}">All Products</a>
    {% for category in links %}
<a class="dropdown-item" href="{{category.get_url}}">{{category}}</a>
    {% endfor %}
类别模型-

class Category (models.Model):
    name=models.CharField(max_length=250, unique=True)
    slug=models.SlugField(max_length=250, unique=True)
    description=models.TextField(blank=True)
    image=models.ImageField(upload_to='category',blank=True)

    def get_url(self):
        return reverse('products_by_category',args=[self.slug])

    def __str__(self):
        return self.name
产品模型-

class Product(models.Model):
    name=models.CharField(max_length=250, unique=True)
    slug=models.SlugField(max_length=250, unique=True)
    description=models.TextField(blank=True)
    category=models.ForeignKey(Category, on_delete=models.CASCADE)
    price=models.DecimalField(max_digits=10,decimal_places=2)
    image=models.ImageField(upload_to='product',blank=True)
    stock=models.IntegerField()
    available=models.BooleanField(default=True)
    created=models.DateTimeField(auto_now_add=True)
    updated=models.DateTimeField(auto_now=True)

    def get_url(self):
        return reverse('product_detail',args=[self.category.slug,self.slug])

    def __str__ (self):
        return self.name
在这里,您可以看到
def get_url(self)
位于
类别中
以及
产品
型号中 我只想知道为什么
{{category.get_url}}
中的category知道访问
category
中的方法,而不是
Product
model


Foo类:
def blah():
返回“foo的废话”
分类栏:
def blah():
返回“酒吧的废话”
f=Foo()
f、 废话
这与您的示例中发生的情况类似。
f
没有理由(即没有办法)访问
Bar
类中的任何内容


在您的示例中,中间有一些步骤,即,有一个对象列表,然后将该列表传递给模板并循环。但这并不相关,该列表中的项目仍然是相同的类型(即,每个项目仍然是
类别
的一个实例),没有任何东西将它们更改为
产品
(如果是,这将非常奇怪,尽管在Python中技术上是可能的)。

因为它是
类别
对象,这就是面向对象编程的工作原理(在Python中)。
class Product(models.Model):
    name=models.CharField(max_length=250, unique=True)
    slug=models.SlugField(max_length=250, unique=True)
    description=models.TextField(blank=True)
    category=models.ForeignKey(Category, on_delete=models.CASCADE)
    price=models.DecimalField(max_digits=10,decimal_places=2)
    image=models.ImageField(upload_to='product',blank=True)
    stock=models.IntegerField()
    available=models.BooleanField(default=True)
    created=models.DateTimeField(auto_now_add=True)
    updated=models.DateTimeField(auto_now=True)

    def get_url(self):
        return reverse('product_detail',args=[self.category.slug,self.slug])

    def __str__ (self):
        return self.name