#python #django #class
#python #django #класс
Вопрос:
У меня есть родительский класс и дочерний класс, который наследует родительский класс. И это нормально, я могу выполнить итерацию с помощью цикла for. Теперь я хочу получить доступ к дочернему классу (пример: ‘product_type’ Так что, по сути, я не понимаю, как мы наследуем материал от дочернего класса внутри того же цикла…
views.py
from django.views import generic
from . models import Category
from django.shortcuts import render
class CategoryListView(generic.ListView):
model = Category
template_name = 'category_list.html'
models.py
from django.db import models
import uuid
class Category(models.Model):
name = models.CharField(max_length=100, help_text='Category name')
def __str__(self):
return self.name
class Meta:
verbose_name_plural = 'Categories'
class Product(models.Model):
product_name = models.CharField(max_length=255, help_text='Product name')
# product_spec = models.TextField(max_length=5000, help_text='Product specs')
product_type = models.ForeignKey('Category', on_delete=models.SET_NULL, null=True)
def __str__(self):
return self.product_name
category_list.html
{% extends 'base.html' %}
{% block body %}
{% for page in category_list %}
<li>{{ page.name }}</li>
<li>{{ page.product_name }} # <--------------- Now this is the point of
#my problem, I want to get
#product name from child
#class
#this returns empty <li>
{% endfor %}
{% endblock %}
Ответ №1:
вы можете для этого
{% extends 'base.html' %}
{% block body %}
{% for page in category_list %}
<li>{{ page.name }}</li>
<li>{{ page.product_set.first.product_name }}
product name from child class, this returns empty <li>
{% endfor %}
{% endblock %}
Комментарии:
1.
page.product_set.first.product_name
не решает внутреннюю проблему, заключающуюся в том, что их будет несколько продуктов одной категории
Ответ №2:
Прежде всего измените свое product_type
имя так category
, чтобы его было проще понять, и добавьте related_name
к нему атрибут следующим образом:
class Product(models.Model):
name = models.CharField(max_length=255, help_text='Product name')
category = models.ForeignKey('Category', on_delete=models.SET_NULL, null=True, related_name='products')
затем в вашем шаблоне
{% for category in category_list %}
{{ category.name }}
{% for product in category.products.all %}
{{ product.name}}
... other product data
{% endfor %}
{% endfior %}
Комментарии:
1. Да, это должно сработать, просто убедитесь, что вы включили
related_name
атрибут и переименовали поля в соответствии с моим ответом.2. Они заблокировали меня от вопроса, лол. Чудаки! Кстати, я нашел другой способ сделать это. К сожалению, ваш способ не сработал. Мой следующий шаг, идущий глубже, я хочу напечатать экземпляры (отделенные от остальных продуктов), например: — page1.html содержит только модели телефонов — page2.html содержит только модели наушников … и т.д. Есть какие-нибудь советы?
3. добавьте
Category
модель и добавьте к ней внешний ключ aProduct
, затем создайте несколько категорий и назначьте им продукты, затем отфильтруйте продукты по соответствующей категории
Ответ №3:
product_type
in Product
— это a ForaignKey
, что означает, что у них будет несколько продуктов, имеющих одинаковое Category
значение, поэтому у них существует два решения
- сделайте
product_type
вProduct
ключе один к одному, при этом вы должны получить одно имя с помощью{{ page.product.product_name }}
- распечатать список всех товаров категории, вы можете сделать это путем итерации
page.product_set
, поскольку это список (итерируемый) с циклом for.
Комментарии:
1. Установление взаимосвязи
OneToOne
означало бы, что в 1 категории может быть только 1 продукт, а этого не должно быть.2. @SLDem Я не знаю бизнес-логики; мой ответ включает в себя оба случая.
3. @SLDem Хорошо, у меня есть «Наушники для телефонов», но это все, я не понимаю, как это называется…
4. прочитайте мой ответ, я переименовал поле в
Product
модели5. @SLDem я знаю, просто скопировал ваш код, но все равно не показываю все, что должен. Это безумие