【发布时间】:2015-02-20 18:41:35
【问题描述】:
我是 django 新手,所以请耐心等待 :)
像以前的许多人一样,我正在尝试构建一个 reddit 克隆。我已经完成了所有工作,但缺少一部分。在不产生太多数据库请求的情况下,我想指出当前用户是否为特定问题投票。
这是我的模型的样子:
from django.db import models
from django.conf import settings
from mptt.models import MPTTModel, TreeForeignKey
max_post_length = 2000
class Thread(models.Model):
title = models.CharField(max_length=200)
text = models.TextField(max_length=max_post_length)
created = models.DateField()
user = models.ForeignKey(settings.AUTH_USER_MODEL)
userUpVotes = models.ManyToManyField(settings.AUTH_USER_MODEL, blank=True, related_name='threadUpVotes')
userDownVotes = models.ManyToManyField(settings.AUTH_USER_MODEL, blank=True, related_name='threadDownVotes')
def __str__(self):
return self.title
class Comment(MPTTModel):
title = models.CharField(max_length=200)
text = models.TextField(max_length=max_post_length)
created = models.DateField()
user = models.ForeignKey(settings.AUTH_USER_MODEL)
thread = models.ForeignKey(Thread)
parent = TreeForeignKey('self', related_name='children', blank=True, null=True)
vote_count = models.IntegerField(default=0)
userUpVotes = models.ManyToManyField(settings.AUTH_USER_MODEL, blank=True, related_name='commentUpVotes')
userDownVotes = models.ManyToManyField(settings.AUTH_USER_MODEL, blank=True, related_name='commentDownVotes')
class MPTTMeta:
order_insertion_by = ['created']
def save(self, *args, **kwargs):
self.vote_count = self.userUpVotes.count() - self.userDownVotes.count()
super(Comment, self).save(*args, **kwargs)
def __str__(self):
return self.title
这是我的看法:
from django.shortcuts import get_object_or_404, render
from community.models import Thread, Comment
from django.http import HttpResponse
def detail(request, thread_id):
thread = get_object_or_404(Thread, pk=thread_id)
comments = thread.comment_set.all()
return render(request, 'threads/detail.html', {
'thread': thread,
'comments': comments
})
这是我的模板:
{% extends "base.html" %}
{% load mptt_tags %}
{% block content %}
<h1>{{ thread.title }}</h1>
<p>{{ thread.text }}</p>
<ul class="comments">
{% recursetree comments %}
<li>
<div class="comment-block clearfix">
<vote-up-down up="{{ node.up_vote_by_user }}"
down="{{ node.user_down_vote }}"
url="/community/comment/{{ node.id }}/vote/"
count="{{ node.vote_count }}"></vote-up-down>
<div class="comment">
<h4>{{ node.title }}</h4>
<div class="text">{{ node.text }}</div>
</div>
</div>
{% if not node.is_leaf_node %}
<ul class="children">
{{ children }}
</ul>
{% endif %}
</li>
{% endrecursetree %}
</ul>
{% endblock content %}
填充 node.up_vote_by_user 和 node.down_vote_by_user 的最佳方式是什么? 我尝试使用用户中间件和模型方法。我也尝试过对 cmets 进行预迭代,但这不能与用于列表的递归一起使用。
【问题讨论】:
标签: python django django-models django-views