【发布时间】: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