【问题标题】:how to django category related tags如何 django 类别相关标签
【发布时间】:2020-08-13 04:45:09
【问题描述】:

感谢您的阅读。

python 3.x, django 3

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

例如

类别 [水果、饮料、肉类]

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

我想点击水果中的类别以显示 [apple, orange, pear] 的标签

项目/博客/context.py

​​>
from .models import Category, Tag


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

项目/项目/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
        ],
    },
},

]

项目/博客/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

项目/博客/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, 'blog/index.html', {'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, 'blog/index.html', {'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 [类别->标签]

所以我修好了

项目/博客/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

项目/博客/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/list.html', {'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, 'blog/list.html', {'tag': tag, '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, 'blog/list.html', {'category': category, 'blog': blog })

""" DETAIL """
#...

以及如何输出

项目/博客/模板/博客/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 %}

【问题讨论】:

    标签: python django tags categories


    【解决方案1】:

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

    看看这个例子:)

    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 %}
    

    【讨论】:

    • 很抱歉给了我你的努力,但我听不懂(T_T)
    • 建议使用 python manage.py shell 进行测试。并导入模型对其进行测试:)
    猜你喜欢
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    • 2011-09-10
    • 1970-01-01
    相关资源
    最近更新 更多