#python #django #list
#python #django #Список
Вопрос:
Я практикуюсь в python и django, создавая сайт рецептов. Я могу добавлять ингредиенты (класс RecipeIngredient) для каждого рецепта, используя встроенные строки, ища ингредиенты, которые у меня уже есть в моей базе данных (класс Ingredient) (с информацией о питании и т. Д.). В результате получается один большой список ингредиентов для каждого рецепта.
Чтобы упорядочить их, я добавил атрибут step и stepnum. Я возвращаю список, упорядоченный по stepnum, но как я могу разделить их? Например. Если вы делаете торт, у вас будут ингредиенты для торта и для глазури. все ингредиенты для глазури получат значение шага «глазурь» и значение шага 0. все ингредиенты для торта получат значение шага «торт» и значение шага 1.
Я бы хотел, чтобы все ингредиенты со значением шага 1 отображались под тем, который имеет значение, связанное с элементами, имеющими значение шага 1, в данном случае «торт».
Как?
У меня есть этот код на моем recipedetail.html:
<div><h1> INGREDIENTS: </h1></div>
<div>
{% for ingredients in recipe.get_text %}
<ul>
{% for item in ingredients %}
<li><em>
{{item.1|safe}} {% if item.2 is not None %} {{item.2|safe}} {% endif %} {{ item.0|safe}}
</em></li>
{% endfor %}
</ul>
{% endfor %}
</div>
и функция get_text:
def get_text(self):
a = []
ingredients = []
for ingredient in self.RecipeIngredients.all():
ingredients.append((ingredient.ingredientname, ingredient.amount, ingredient.unit, ingredient.step, ingredient.stepnum))
ingredients.sort(key=lambda tup: tup[4])
a.append(ingredients)
return a
и моя модель:
class RecipeIngredient(models.Model):
recipe = models.ForeignKey(Recipe, related_name='RecipeIngredients', on_delete=models.CASCADE)
ingredientname = models.ForeignKey(Ingredient, on_delete=models.CASCADE)
amount = models.IntegerField(blank=True, null=True)
unit = models.ForeignKey(Unit, on_delete=models.CASCADE, blank=True, null=True)
step = models.CharField(max_length=200, blank=True)
stepnum = models.IntegerField(default="0")
def __str__(self):
return str(self.ingredientname)
Ответ №1:
Вы могли бы сделать это в своей модели, добавив:
class Meta:
ordering = ['step', 'stepnum']
Или в views.py использование group by.
Попробуйте выполнить тяжелую работу, прежде чем перейти к шаблону.