如何在Django中创建订阅按钮

时间:2019-02-13 14:51:41

标签: python django web

我是Web开发和Python编程的新手。

我想创建一个按钮,用户可以在该按钮中订阅和取消订阅论坛中的子频道(很像论坛类别)。

我真正想要的是使用户能够通过单击子频道的按钮来订阅和取消订阅。

views.py:

class SubChannelSubscriptionView(ListView):
    template_name = 'subscription.html'
    model = Topic

    def get_queryset(self):
        return SubChannelSubscription.objects.filter(user=self.request.user)

    def get_context_data(self, **kwargs):
        context = super(SubChannelSubscriptionView, self).get_context_data(**kwargs)
        context['SubChannel'] = SubChannel.objects.all()
        context['top'] = Topic.objects.filter(category__subchannel_subs__user=self.request.user)
        return context

    def subd(self, request):
        subchannel = get_object_or_404(SubChannel, pk=self.kwargs['pk'])
        is_subd = False
        if subchannel.subd.filter(pk=request.user).exists():
            subchannel.subd.remove(request.user)
            is_subd = False
        else:
            subchannel.is_subd.add(request.user)
            is_subd = True
        return reverse('index')

models.py:

class SubChannel(models.Model):
    title = models.CharField(max_length=150, unique=True, null=True)
    description = models.CharField(max_length=150, null=True)
    subd = models.ManyToManyField(User, related_name='subd' )

subscription.html:

<form action="{% url 'index' %}" method="post">
    {% csrf_token %}
    {% if is_subd %}
        {% for sb in SubChannel %}
            <button type="submit" value="" > subd{{ sb }} </button>
        {% endfor %}
    {% else %}
         {% for sb in SubChannel %}
              <button type="submit"  value="" >not sub {{ sb }}</button>
         {% endfor %}    
    {% endif %}
</form>

1 个答案:

答案 0 :(得分:0)

在订阅之间切换的一种简单方法是为其创建一个url并通过ajax执行它。 在该网址中,我们获得了用户和频道,然后通过查询该用户是否订阅了频道(如果为True则删除该用户)将其添加到频道中。

我无法为其发布任何代码,因为我不了解其逻辑。在这里,我注意到SubChannel具有用户的ForaignKey channel和ManyToManyField。

我认为应该只有两个模型

  1. 频道
  2. 用户-> ManyToManyField频道

通过这种方式,可以轻松管理具有多个频道的用户以及所有订阅频道的用户。 Django ORM在内部添加UserChannel的第三个DBTable。 (我了解这可能无法满足您的特定要求。)