Я хочу получить все обои, которые имеют схожие названия, теги с обоями, которые визуализируются

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>

Здесь будут перечислены названия обоев, которые имеют одинаковые или похожие теги.

Вернуться на верх