如何django与类别相关的标签

问题描述

谢谢您的阅读。

python 3.x, django 3

我有关于如何关联类别和标签的堆栈。

例如

类别 [水果,饮料,肉]

标签 [水,牛肉,苹果,可乐,橙子,梨]

我想单击水果中的类别以显示[苹果,橙,梨]的标签

project / blog / context.py

from .models import Category,Tag


def related(request):
    context = {
        'category_list': Category.objects.all(),'tag_list': Tag.objects.all(),}
    return context

project / project / settings.py

TEMPLATES = [
{
    'BACKEND': 'django.template.backends.django.DjangoTemplates','DIRS': [],'APP_DIRS': True,'OPTIONS': {
        'context_processors': [
            'django.template.context_processors.debug','django.template.context_processors.request','django.contrib.auth.context_processors.auth','django.contrib.messages.context_processors.messages','blog.context.related',### add project/blog/context.py
        ],},

]

project / blog / models.py

from django.db import models

""" category model """
class Category(models.Model):
    name = models.CharField('category',max_length=50)

    def __str__(self):
        return self.name

""" Tag model """
class Tag(models.Model):
    name = models.CharField('tag',max_length=50)
    category = models.ForeignKey(Category,verbose_name='Parent-category',on_delete=models.PROTECT) # I guess this is related category

    def __str__(self):
        return self.name

""" blog model """
class Blog(models.Model):
    title = models.CharField('title',max_length=50)
    text = models.TextField('text')
    category = models.ForeignKey(Category,verbose_name='category',on_delete=models.PROTECT)
    tag = models.ManyToManyField(Tag,verbose_name='tag')
    relation = models.ManyToManyField('self',verbose_name='related',blank=True)
    created_at = models.DateField('created',auto_now_add=True)
    updated_at = models.DateField('updated',auto_now=True)

    def __str__(self):
        return self.title

project / blog / views.py

from django.shortcuts import render,get_object_or_404
from .models import Category,Tag,Blog

""" LIST """
def index(request):
    blog = Blog.objects.order_by('-id')
    return render(request,'blog/index.html',{'blog': blog })

""" CATEGORY """
def category(request,category):
    category = Category.objects.get(name=category)
    blog = Blog.objects.filter(category=category).order_by('-id')
    return render(request,{'category': category,'blog': blog })

""" TAG """
def tag(request,tag):
    tag = Tag.objects.get(name=tag)
    blog = Blog.objects.filter(tag=tag).order_by('-id')
    return render(request,{'tag': tag,'blog': blog })

""" DETAILE """
def detail(request,slug):
    blog = Blog.objects.get(slug=slug)
    blog_text = get_object_or_404(Blog,slug=slug)
    return render(request,'blog/detail.html',{'blog_text': blog_text })

project / blog / templates / blog / index.py

{% extends 'blog/base.html' %}

{% block content %}

    <a href='{% url 'blog:index' %}'><p>TOP</p></a>
    <div>
        <h4>CATEGORY</h4>
        {% for category in category_list %}
            <a href='{% url 'blog:category' category %}'>
                <p style='float: left; margin-right: 5px;>
                    {{ category.name }}
                </p>
            </a>
        {% endfor %}
    </div>
    <br>

    <!-- FOR TAG -->
    <div style='clear: both;'>
        <h4>TAG</h4>
        {% for tag in tag_list %}
            <a href='{% url 'blog:tag' tag %}'>
                <p style='float: left; margin-right: 5px;>
                    {{ tag.name }}
                </p>
            </a>
        {% endfor %}
    </div>

    <h1 style='clear: both;'>LIST</h1>
    <br>

    <!-- FOR TAG -->
    {% if category %}
        <h3>CATEGORY:{{ category }}</h3>
    {% elif tag %}
        <h3>TAG: {{ tag }}</h3>
    {% endif %}

    {% for blog in blog %}
        <ul>
            <li>
                {{ blog.created_at }}
                {{ blog.title }}
                <a href="{% url 'blog:detail' blog.pk %}">detail</a>
            </li>
        </ul>
    {% endfor %}

{% endblock %}

我猜在project / blog / views.py中没有正确的代码,但是我不知道如何编写正确的代码...

=============================================

谢谢您的回答。对于我的理解有限,我感到非常抱歉。

我了解将标签绑定到类别 o [标签->类别] x [类别->标签]

所以我解决

project / blog / models.py

from django.db import models

""" Tag Change order tag and category !!!!! """
class Tag(models.Model):
name = models.CharField('TAG',max_length=50)

def __str__(self):
    return self.name

""" category """
class Category(models.Model):
    name = models.CharField('CATEGORY',max_length=50)
    tag = models.ManyToManyField(Tag,verbose_name='TAG') # add tag form in category list !!!!

    def __str__(self):
        return self.name

""" blog """
#...

然后

python manage.py makemigration blog

python manage.py migrate

python manage.py runserver

转到

http://127.0.0.1:8000/admin/blog/category/1/change/

绑定类别和标签 但是我还是不明白如何纠正views.py

project / blog / views.py

from django.shortcuts import render,'blog/list.html',{'blog': blog })

""" TAG """
def tag(request,'blog': blog })

""" CATEGORY """
def category(request,'blog': blog })

""" DETAIL """
#...

以及如何输出

project / blog / templates / blog / index.html

<h1>CATEGORY</h1>
{% for category in category_list %}
<p>{{ category.name }}<p>
{% endfor %}

<h1>TAG</h1>
{% for tag in tag_list %}
<p>{{ tag.name }}<p>
{% endfor %}

解决方法

我认为您不需要使用上下文处理器。

看这个例子:)

class Tags(models.Model):
    tag = models.CharField(max_length=20)

class Category(models.Model):
    # ...
    tags = models.ManyToManyField(Tag)


# how to use this..
## save
tag_list = ['water','beef','apple','cola','orange']

for tg in tag_list:
    Tags.objects.create(tag=tg)

category = Category.objects.create()
category.save()
category.tags.add(Tags.objects.all()[1:3])
category.save()

## view(how to get query at the Category)
Category.objects.all()[0].tags.all()
cat = Category.objects.all()[0].tags.all()

和模板

{% for category in cat %}
    {{ category.tag }}
{% endfor %}

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...