Как получить доступ к связанной таблице в django

В моем блоге есть несколько рецептов в каждой записи блога. И рецепты используются более одного раза во всех записях блога.

Я пытаюсь создать страницу, на которой я могу отобразить все рецепты в виде сетки. Когда посетитель нажимает на рецепт, я хочу, чтобы он был связан с первой записью блога в базе данных, которая включает этот конкретный рецепт. Потому что у меня есть html-страницы для каждой записи блога, но не для каждого рецепта.

Я не могу понять, как это будет структурировано и реализовано. Должен ли я перепроектировать модели или есть способ сделать это с помощью шаблонов django? Любая помощь будет оценена по достоинству!

models.py

class Posts(models.Model):
    title = models.CharField(max_length=155)
    summary = models.TextField(blank=True, null=True)
    slug = models.SlugField(unique=True, max_length=155)
    recipes = models.ManyToManyField('Recipes', through='PostRecipes')
    

class PostRecipes(models.Model):
    post = models.ForeignKey('Posts', models.DO_NOTHING)
    recipe = models.ForeignKey('Recipes', models.DO_NOTHING)


class Recipes(models.Model):
    title = models.CharField(max_length=155)
    summary = models.TextField(blank=True, null=True)
    content = models.TextField(blank=True, null=True)

views.py

def allrecipes(request):
    recipes = Recipes.objects.all()

    context = {
        'recipes': recipes,
    }
    return render(request, "All-recipes.html", context)

All-recipes.html

{% for item in recipes %}
  <a href="{{ STATIC_URL }}/{{ item.slug }}">{{ item.title }}</a>
{% endfor %}

Вы должны использовать ManyToManyField на самом деле:

class Posts(models.Model):
    title = models.CharField(max_length=155)
    summary = models.TextField(blank=True, null=True)
    slug = models.SlugField(unique=True, max_length=155)
    

class Recipes(models.Model):
    title = models.CharField(max_length=155)
    summary = models.TextField(blank=True, null=True)
    content = models.TextField(blank=True, null=True)
    posts = mdoels.ManyToManyField("Posts", related_name='recipes')

Пример документаций Django : https://docs.djangoproject.com/en/3.2/topics/db/examples/many_to_many/

После этого вы можете получить доступ к связанной таблице через:

Recipes.objects.first().posts # first recipe for example
Posts.objects.first().recipes # first post for example, accessing via related name

А в вашем шаблоне будет что-то вроде этого:

{% for item in recipes %}
  <a href="{{ STATIC_URL }}/{{ item.posts.first.slug }}">{{ item.posts.first.title }}</a>
{% endfor %}
Вернуться на верх