我已设法按照我的意愿在索引页面上添加帖子。事情是,我希望能够只针对一个帖子。
我所做的是创建两个方法,一个是pin,另一个是unpin,两个是BooleanFields。
我想做的是,就像在推特中一样,当你固定一个帖子时,另一个帖子在它失去固定状态之前,而那个刚刚固定的帖子就取代了它。
这是我的models.py文件:
class Post(models.Model, HitCountMixin):
author = models.ForeignKey('auth.User')
title = models.CharField(max_length=200)
thumbnail = models.ImageField(upload_to='Media', default="Media/atom.png")
text = models.TextField()
create_date = models.DateTimeField(default=timezone.now)
published_date = models.DateTimeField(blank=True, null=True)
pinned = models.BooleanField(default=False)
hit_count_generic = GenericRelation(
HitCount, object_id_field = 'pk',
related_query_name = 'hit_count_generic_relation')
def publish(self):
self.published_date = timezone.now()
self.save()
def pin(self):
self.pinned = True
self.save()
def unpin(self):
self.pinned = False
self.save()
我有这个模板,其中一个按钮允许我根据以下if语句打开或关闭固定的布尔字段:
{% if user.is_authenticated %}
...
{% if post.published_date %}
{% if post.pinned is False %}
<div class="pin">
<a class="btn btn-primary" href="{% url 'pin' pk=post.pk %}">
<span class="glyphicon glyphicon-pushpin"> Pin (index)</span>
</a>
</div>
{% endif %}
{% if post.pinned is True %}
<div class="pin">
<a class="btn btn-danger" href="{% url 'unpin' pk=post.pk %}">
<span class="glyphicon glyphicon-pushpin"> Unpin (index)</span>
</a>
</div>
{% endif %}
以下是来自urls.py文件的代码段:
...
url(r'^post/(?P<pk>\d+)$', views.PostDetailView.as_view(), name='post_detail'),
...
# pin | unpin
url(r'^post/(?P<pk>\d+)/pin', views.pin_post, name='pin'),
url(r'^post/(?P<pk>\d+)/unpin', views.unpin_post, name='unpin'),
...
和views.py:
class PostListView(ListView):
model = Post
paginate_by = 5
def get_queryset(self):
return Post.objects.filter(published_date__lte=timezone.now()).order_by('-published_date')
...
# pin post -> index
@login_required
def pin_post(request, pk):
post = get_object_or_404(Post, pk=pk)
post.pin()
return redirect('index')
# unpin post <- index
@login_required
def unpin_post(request, pk):
post = get_object_or_404(Post, pk=pk)
post.unpin()
return redirect('index')
我想要发生的是,一旦我将固定的BooleanField
设置为True
,之前固定的BooleanField
帖子就会设置为false。目前我只设置了一次固定多个帖子。
答案 0 :(得分:1)
当您发布帖子时,您可以取消固定所有其他帖子:
@login_required
def pin_post(request, pk):
for p in Post.objects.all():
if post.pinned: post.unpin()
post = Post.objects.filter(pk=pk).first()
post.pin()
return redirect('index')