Как вызвать список в шаблоне django? - PullRequest
0 голосов
/ 03 августа 2020

Вот мой файл models.py.

from django.db import models
from django.contrib.auth.models import User
from django.urls import reverse
from django.utils.text import slugify
import misaka
from django.contrib.auth import get_user_model

# Create your models here.
class Category(models.Model):
    name = models.CharField(max_length=255, unique=True)
    slug = models.SlugField(allow_unicode=True, unique=True)
    description = models.TextField(blank=True, default='')
    description_html = models.TextField(editable=False, default='',blank=True)
    members = models.ManyToManyField(User, through="CategoryMember")
    category_pic = models.ImageField(upload_to = 'category_pics', blank=True)

    def __str__(self):
        return self.name

    # WE are saving the model. But before that we are converting
    # the name using slugify and description using misaka.
    def save(self, *args, **kwargs):
        self.slug = slugify(self.name)
        self.description_html = misaka.html(self.description)
        super().save(*args, **kwargs)

    #get_absolute_url is used because it tell the template
    # CreateView to go to the page it is directing.
    # for this example it is directing to go to single page of a category.
    def get_absolute_url(self):
        return reverse("categories:single", kwargs={"slug":self.slug})

    class Meta:
        ordering = ['name']


class CategoryMember(models.Model):
    category = models.ForeignKey(Category, related_name = "memberships", on_delete=models.CASCADE)
    user = models.ForeignKey(User, related_name="user_categories", on_delete=models.CASCADE)

    def __str__(self):
        return self.user.username

    class Meta:
        unique_together= ("category", "user")

Это некоторая часть файла views.py

from django.contrib.auth.models import User
from categories.models import CategoryMember, Category
class UserPosts(ListView):
    model = Post
    template_name = 'posts/user_post_list.html'

    def get_queryset(self):
        try:
            self.post_user = User.objects.prefetch_related("user_of_post_model").get(
                username__iexact=self.kwargs.get("username")
            )
        except User.DoesNotExist:
            raise Http404
        else:
            return self.post_user.user_of_post_model.all()

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)

        current_user = UserProfileInfo.objects.filter(
            user__id__iexact = self.post_user.id
        ).get()


        i=1
        user_categories={}
        for member in CategoryMember.objects.all():
            if member.user == self.post_user:
                user_categories.update({i:member.category.name})
                i=i+1
            else:
                print('not found')
        print(user_categories)

        if current_user.profile_pic:
            profile_pic = True
            picture = current_user.profile_pic
            edited_picture = get_thumbnail(picture, '350x350', quality=99, format='PNG')
        else:
            profile_pic = False
            root = settings.MEDIA_ROOT
            import os
            root1 = os.path.join(root, 'profile_pics/no-image.png')
            picture = root1
            edited_picture = get_thumbnail(picture, '350x350', quality=99, format='PNG')
            # resizeimage.resize_cover(picture, [200, 100], validate=False)
            # rescale_image(picture,width=100,height=100)


        current_user1 = current_user
        user_info = {
            'current_user':current_user,
            'user_categories':user_categories,
            'picture':edited_picture,
            'profile_pic':profile_pic,
            'post_user':self.post_user,
        }

        context['user_info'] = user_info
        return context

После рендеринга страницы html я вижу этот словарь имеет ценности внутри. Вот значения, напечатанные в терминале.

не найдено не найден не найден не найден не найден {1: 'Регрессия', 2: 'Классификация'}

Теперь я хочу получить user_categories в моем шаблоне django. Я пробовал использовать разные подходы, но не могу получить user_categories.

это часть моего django html файла.

<h3>Member of Categories</h3>
            {# this line shows error #}
            {# {{ userinfo[{{user_categories}}] }} #}

            {{  userinfo.user_categories.1 }}

            {% for categories in userinfo.user_categories %}
                  {{categories}}
            {% endfor %}
            
            <h5 class="techfont">Post written by {{user_info.post_user.username}} : {{post_list.count}} </h5>

Этот раздел отображает только user_info.post_user. имя пользователя, но не user_info.user_categories.1 см. текст ниже.

Member of categories.
Post written by abc: 1

1 Ответ

0 голосов
/ 03 августа 2020

user_categories - это словарь, а не список. Так что попробуйте вот так:

 {% for idx, categories in userinfo.user_categories.items %}
      {{idx}}. {{categories}}
 {% endfor %}
...