Я хочу получить все обои, которые имеют схожие названия, теги с обоями, которые визуализируются
view.py
def download(request, wallpaper_name):
wallpaper = Wallpaper.objects.get(name=wallpaper_name)
context = {'wallpaper': wallpaper}
return render(request, 'Wallpaper/download.html', context)
models.py
class Tags(models.Model):
tag = models.CharField(max_length=100)
модель обоев
class Wallpaper(models.Model):
name = models.CharField(max_length=100, null=True)
size = models.CharField(max_length=50, null=True)
pub_date = models.DateField('date published', null=True)
resolution = models.CharField(max_length=100, null=True)
category = models.ManyToManyField(Category)
tags = models.ManyToManyField(Tags)
HTML
<ul>
<li>{{wallpaper.name}}</li>
{% for i in wallpaper.tags_set.all %}
<li>{{i.tags}}</li>
{% endfor %}
url.py
path('<wallpaper_name>/', views.download, name="download"),
Например, обои, которые я выбрал для загрузки, имеют теги природа и океан, поэтому мне нужны все обои, которые имеют этот тег
Должно быть
<ul>
<li>{{wallpaper.name}}</li>
{% for i in wallpaper.tags.all %}
<li>{{i.tags}}</li>
{% endfor %}
</ul>
вместо
<ul>
<li>{{wallpaper.name}}</li>
{% for i in wallpaper.tags_set.all %}
<li>{{i.tags}}</li>
{% endfor %}
</ul>
Если вы хотите получать обои, похожие на те, которые у вас есть, на основе тегов, вам следует использовать эту библиотеку django-taggit.
В API этой библиотеки есть метод similar_objects()
.
Вот как будет выглядеть ваша модель обоев.
from taggit.managers import TaggableManager
class Wallpaper(models.Model):
name = models.CharField(max_length=100, null=True)
size = models.CharField(max_length=50, null=True)
pub_date = models.DateField('date published', null=True)
resolution = models.CharField(max_length=100, null=True)
category = models.ManyToManyField(Category)
tags = TaggableManager()
И в вашем файле views.py
def download(request, wallpaper_name):
wallpaper = Wallpaper.objects.get(name=wallpaper_name)
similar_wallpapers = wallpaper.tags.similar_objects()
context = {'wallpaper': wallpaper, 'similar_wallpapers': similar_wallpapers}
return render(request, 'Wallpaper/download.html', context)
HTML
<ul>
<li>{{wallpaper.name}}</li>
{% for wallpaper in similar_wallpapers %}
<li>{{wallpaper.name}}</li>
{% endfor %}
</ul>
Здесь будут перечислены названия обоев, которые имеют одинаковые или похожие теги.