2017-05-31 75 views
0

这里是我的Post型号:检查用户是否已经投票在后,在模板

模式

class Post(models.Model): 
    user = models.ForeignKey(User, blank=True, null=True) 
    title = models.TextField(max_length=76) 
    content = models.TextField(null=True, blank=True) 
    ... 


class PostScore(models.Model): 
    user = models.ForeignKey(User, blank=True, null=True) 
    post = models.ForeignKey(Post, related_name='score') 
    upvotes = models.IntegerField(default=0) 
    downvotes = models.IntegerField(default=0) 

这是我的模板。我想要做这样的事情......如果用户已经upvoted或downvoted后,然后隐藏给予好评/ downvote按钮:

{% if request.user in Post.has_answered %} 
{% else %} 
    <img src="upvote.png" class="upvote" /> 
    <img src="downvote.png" class="downvote" /> 
{% endif %} 

我计划通过增加ManyToManyFieldhas_answeredPost模型要做到这一点,但我无法这样做,因为我得到这个错误:

post.Post.has_answered: (fields.E304) Reverse accessor for 'Post.has_answered' clashes with reverse accessor for 'Post.user'. 
    HINT: Add or change a related_name argument to the definition for 'Post.has_answered' or 'Post.user'. 

post.Post.user: (fields.E304) Reverse accessor for 'Post.user' clashes with reverse accessor for 'Post.has_answered'. 
    HINT: Add or change a related_name argument to the definition for 'Post.user' or 'Post.has_answered'. 

任何想法如何我可以解决这个问题?我不太确定错误信息,因为我不认为我可以改变我目前的user字段。

回答

0

你试过从你的Django的意见发送flag到模板,如:

def myView(request): 

    parameters['is_user_voted'] = PostScore.objects.filter(user=self.request.user).exists() 
    ..... 
    ..... 
    send ```parameters``` to your template using render() 

并更改模板:

{% if is_user_voted == 'True' %} 
{% else %} 
    <img src="upvote.png" class="upvote" /> 
    <img src="downvote.png" class="downvote" /> 
{% endif %} 
3

你可以改变你的模型喜欢这个。您可能不需要PostScore模型。

class Post(models.Model): 
    # Other Fields i.e title, content, author ... 
    upvotes = models.ManyToMany(User) 
    downvotes = models.ManyToMany(User) 

您可以使用此功能在帖子上获得upvotes。

upvotes = post_object.upvotes.count() 
downvotes = post_object.downvotes.count() 

要查看用户是否已经upvoted与否,

if request.user in post_object.upvotes.all(): 
    # This user has upvoted this post 

同为downvotes。

您也可以在模板中做类似的事情,并根据条件隐藏/显示按钮。

{% if request.user in post_object.upvotes.all %} 
    <!-- show upvote button highlighted --> 
{% elif request.user in post_object.downvotes.all %} 
    <!-- show downvote button highlighted --> 
{% else %} 
    <!-- Show both buttons (not highlighted) --> 
{% endif %} 

希望这会有所帮助。

+1

它确实是一个正确的解决方案,但如果说我们有大约1000个用户和/或大约1000个upvotes/downvotes,这不会是一个性能问题吗? – EzzatA

+0

我不能在我的'Post'模型中添加另一个'User'字段,否则我会在原始问题中显示错误。我已经有'user = models.ForeignKey(User,blank = True,null = True)'是“Post”的作者,我无法删除它。 – Zorgan

+0

@EzzatA也许使用exists()可以提高性能。 https://docs.djangoproject.com/en/1.9/ref/models/querysets/#exists – rayy

相关问题