Джанго фильтр QuerySet в шаблоне

Обновить

April 2019

Просмотры

461 раз

1

Я все еще учусь в школе и до сих пор новый в языке и Джанго рамке Python и я пытаюсь делать проекты, чтобы узнать лучшие практики для этого.

Сейчас я строй проекта, как следующее:

  • Темы Модель => которого пользователь может написать новую тему
  • Ответы Model => которого пользователь может написать новый ответ на определенную тему
  • Любит Модель => которого пользователь может проголосовать вверх или вниз по теме или ответить

это немного близко от StackOverflow сайта.

Models.py

class Topic(models.Model):
user = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
title = models.CharField(max_length=400)
like = models.IntegerField(default=0)
dislike = models.IntegerField(default=0)
image = models.FileField(blank=True, null=True)
created_date = models.DateTimeField(auto_now=True)

def __str__(self):
    return self.title[0:51]



class Reply(models.Model):
user = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
topic = models.ForeignKey(Topic, on_delete=models.CASCADE)
reply = models.TextField()
created_date = models.DateTimeField(auto_now=True)

def likes(self):
    return Likes.objects.filter(reply=self, reply_flag=1).count()
    likes.short_description = 'likes'

def dislikes(self):
    return Likes.objects.filter(reply=self, reply_flag=-1).count()
    dislikes.short_description = 'dislikes'

def __str__(self):
    return self.reply



class Likes(models.Model):
user = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
reply = models.ForeignKey(Reply, on_delete=models.CASCADE)
reply_flag = models.CharField(max_length=5, choices=(
('0', 'No'), ('1', 'Positive'), ('-1', 'Negative')))  # 1 = vote up , -1 vote down

Views.py

# get all topics 
def Topics(request):
topics = models.Topic.objects.all()
return render(request, 'Topics.html', {'topics': topics})



# get detail of specific topic
def TopicDetails(request, topic_id):
topic = get_object_or_404(models.Topic, pk=topic_id)
return render(request, 'Topic_Details.html', {'topic': topic, 'Likse': models.Likes.objects.all})

Шаблоны:

topics.html:

 {% for topic in topics %}

   {% if topic.image}
      <img src="{{topic.image.url}}"
   {% endif %}
   title : {{ topic.title }}
   by : {{ topic.user }}
   total agree : {{ topic.like }}
   total not agree : {{ topic.dislike }}

{% endfor %}

topic.html:

 topic title : {{ topic.title }}

 {% for reply in topic.reply_set.all %}

   reply : {{ topic.reply }}
   by : {{ reply.user }}
   total agree : {% for like in reply.lieks_set.all %} {% if like.reply == reply and like.reply_flag == '1' %} <!-- should be total of vote up --> {% endif %} {%endfor %}
   total not agree : {% for like in reply.lieks_set.all %} {% if like.reply == reply and like.reply_flag == '-1' %} <!-- should be total of vote down --> {% endif %} {%endfor %}

{% endfor %}

Я сталкивался проблема с фильтром любит на основе ответа, пользователя и флаг ответа (голосовать вверх, голосовать вниз) в topic.html, у меня есть два вопроса:

  • Как мне известно, и как я прочитал после поиска я не мог фильтровать данные в шаблоне, так как я мог бы показать отфильтрованные данные в шаблон на основе ответа, пользователь и флаг ответа (до голосования, голосовать вниз)?
  • Является ли структура приложения правильно?
dan

1 ответы

0

First of all, you should definitely make use of generic views (like DetailView or TemplateView). You have couple of options on how to include proper information, decide which is simpler for you:

  1. Override a get_context of a generic view (and include aggregates in a template variable)
  2. Override get_queryset of a view (inluding aggregates in a query)
  3. Create a custom model manager and include appropriate aggregates in a queryset.

See aggregate and annotate for more information on how to count or sum dependent models.