在Django支持的博客中仅限一个帖子

时间:2017-10-26 00:12:40

标签: python django web

我已设法按照我的意愿在索引页面上添加帖子。事情是,我希望能够只针对一个帖子。

我所做的是创建两个方法,一个是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。目前我只设置了一次固定多个帖子。

1 个答案:

答案 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')