我正在try 渲染多对多关系的标签,但我错过了一些东西

这些是我的模型:

class Post(models.Model):
    date = models.DateTimeField(auto_now_add=True)
    author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name='posts', null=True, blank=True)
    title = models.CharField(max_length=200)
    content = models.TextField(null=True, blank=True)
    image = models.ImageField(upload_to='post/images/', null=True, blank=True)
    slug = models.SlugField(max_length=200, unique=True, null=True, blank=True)
    tag = models.ManyToManyField('Tag', related_name='posts', blank=True)

    def save(self, *args, **kwargs):
        if self.image:
            ext = os.path.splitext(self.image.name)[1]
            filename = f"{datetime.now().strftime('%Y%m%d%H%M%S')}{ext}"
            self.image.name = filename
        if not self.slug:
            self.slug = slugify(self.title)
        return super().save(*args, **kwargs)

class Tag(models.Model):
    name = models.CharField(max_length=200)
    slug = models.SlugField(max_length=200, unique=True, blank=True)
    post = models.ManyToManyField(Post, related_name='tags', blank=True)


    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = slugify(self.name)
        return super().save(*args, **kwargs)

    def __str__(self):
        return self.name

这是我的模板片段

    {% for post in posts  %}
        <div class="news-card">
         
          <img src="{{post.image.url}}" class="news-img" alt="News" />
          <div class="news-listing">
          <ul class="tags">
             {% for tag in post.tag.all %}
              <li class="tag">{{tag.name}}</li>
              {% endfor %} 
            </ul>
            <h3 class="news-title">
              <a href="{{post.slug}}"
                >{{post.title}}</a

这是我正在传递的观点和背景

form = MessageForm()
        context = {
        'posts': posts,
        'events': events,
        'introductorys': introductory,
        'products': products,
        'form': form,
        'authors': 'authors',
    }
        return render(request, 'app/index.html', context)

我期望生成标签列表,但模板没有生成任何标签

推荐答案

你是duplicatingManyToManyField:你在第一个模型中制造了一个,在第二个模型中制造了一个.这意味着存在two个关系,并且将Post添加到标签中,不会最终出现在另一个标签中.

因此,您应该将两个ManyToManyField合并为一.没有必要创建第二个:使用related_name=… [Django-doc],您可以在另一个中添加一个描述符,以相反的方式访问对象.

例如,我们可以用途:

class Post(models.Model):
    def post_image_filename(self, filename):
        ext = os.path.splitext(self.image.name)[1]
        filename = f"post/images/{datetime.now().strftime('%Y%m%d%H%M%S')}{ext}"

    date = models.DateTimeField(auto_now_add=True)
    author = models.ForeignKey(
        Author,
        on_delete=models.CASCADE,
        related_name='posts',
        null=True,
        blank=True,
    )
    title = models.CharField(max_length=200)
    content = models.TextField(null=True, blank=True)
    image = models.ImageField(
        upload_to=post_image_filename, null=True, blank=True
    )
    slug = models.SlugField(max_length=200, unique=True, null=True, blank=True)
    tags = models.ManyToManyField('Tag', related_name='posts', blank=True)

    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = slugify(self.title)
        return super().save(*args, **kwargs)


class Tag(models.Model):
    name = models.CharField(max_length=200)
    slug = models.SlugField(max_length=200, unique=True, blank=True)
    # no post

    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = slugify(self.name)
        return super().save(*args, **kwargs)

    def __str__(self):
        return self.name

然后我们因此与:

<ul class="tags">
  {% for tag in post.tags.all %}
    <li class="tag">{{ tag.name }}</li>
  {% endfor %} 
</ul>

Note:您可以使用django-autoslug [GitHub]根据其他字段自动创建Slug.

Django相关问答推荐

Django中的设计用户类

使用django直接计算geohash而不创建模型

如何根据递归ManyToManyField值创建Django查询集?

获取PyCharm中继承方法的未解析属性引用

从多个数据库访问 Django 会话

错误404除主要应用程序外,HTML页面无法渲染的其他应用程序

Django中用于外键的嵌套循环

Django prefetch_related 与 3 个不直接相关的模型

Django REST Framework 图片上传

在 Django 中,您可以向查询集添加方法吗?

有 Django List View 模型排序吗?

Python Django:您正在使用 staticfiles 应用程序而没有设置 STATIC_ROOT 设置

django过滤器超过几天?

如何找到两个 Django 查询集的交集?

模型表格Save保存,Get获取保存的对象

如何获取经过身份验证的用户列表?

django 应用基于条件的样式类

django.core.servers.basehttp.FileWrapper 在 Django 1.9 中消失

Django: Force强制 Select 相关?

ImportError:没有名为 django_filters 的模块