问题描述
谢谢您的阅读。
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 %}