Я хочу знать, как "категория" знает, к какой модели получить доступ - PullRequest
0 голосов
/ 07 мая 2020

код шаблона-

<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 %}

context_processor.py

def menu_links(request):
    links=Category.objects.all()
    return dict(links=links)

Категория Модель-

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, а также в Product модели. Я просто хочу знать, почему категория в {{category.get_url}} знает, как получить доступ к методу в Category, а не в Product модель

1 Ответ

1 голос
/ 07 мая 2020

class Foo:
    def blah():
        return "blah by foo"

class Bar:
    def blah():
        return "blah by bar"

f = Foo()
f.blah()

Это аналогично тому, что происходит в вашем примере. Нет причин (т.е. нет возможности) для f получить доступ к чему-либо из класса Bar.

В вашем примере есть несколько промежуточных шагов, а именно, есть список объектов, и список затем перешли к шаблону и зациклились. Но это не имеет значения, элементы внутри этого списка все еще одного типа (т.е. каждый элемент по-прежнему является экземпляром Category), ничто не изменило их на Product (что было бы очень странно, если бы это было так, хотя технически возможно в Python).

...