【问题标题】:How to run a view function containing an operation parameter without reloading page如何在不重新加载页面的情况下运行包含操作参数的视图函数
【发布时间】:2019-09-04 14:17:58
【问题描述】:

我正在创建一个允许用户发布 cmets 和点赞帖子的网站。我创建了一个视图函数,它允许用户喜欢帖子,但不确定如何实现 ajax 或类似技术来执行请求而无需重新加载页面。这样用户就不会丢失他们在页面上的位置,并且在喜欢帖子后必须向下滚动才能找到它。

在我的views.py

#this is the function i wish to run without reloading
def like(request, operation, id):
    like = Post.objects.get(id=id)
    if operation == 'add':
        Like.make_like(request.user, like)
    elif operation == 'remove':
        Like.lose_like(request.user, like)
    return HttpResponseRedirect('/Feed/')

#this is the view in which it is called
class FeedView(TemplateView):
    template_name = 'feed.html'


    def get(self, request):
        form = HomeForm()
        posts = Post.objects.all().order_by('-created')
        users = User.objects.exclude(id=request.user.id)
        try:
            like = Like.objects.get(user=request.user)
            likes = like.posts.all()
        except Like.DoesNotExist:
            like = None
            likes = None
        args = {
            'form': form, 'posts': posts, 'users': users, 'likes': likes
        }
        return render(request, self.template_name, args)

    def post(self, request):
        form = HomeForm(request.POST)
        if form.is_valid():
            post = form.save(commit=False)
            post.user = request.user
            post.save()

            text = form.cleaned_data['post']
            form = HomeForm()
            return HttpResponseRedirect('/Feed/')

        args = {'form': form, 'text': text}
        return render(request, self.template_name, args)

feed.html:

    {% for post in posts %}
        <p class="name">{{ post.user.username }}</p>
        <h3>{{ post.post }}</h3>
              {% if not post in likes %}
                <li-r><a class="like" href="{% url 'like' operation='add' id=post.id %}"> {{ post.total_likes }}  </a></li-r>
              {% endif %}
              {% if post in likes %}
                <li-r><a class="unlike" href="{% url 'like' operation='remove' id=post.id %}"> {{ post.total_likes }} </a></li-r>
              {% endif %}
        <p class="date">{{ post.created }}</p>
    {% endfor %}

urls.py:

    urlpatterns = [
    url(r'^Feed/$', FeedView.as_view(), name='feed'),
    url(r'^like/(?P<operation>.+)/(?P<id>\d+)/$', views.like, name='like')
    ]

我尝试将函数放在 Feed 类中,但我不知道如何编写 url 以包含该类以及 "(?P&lt;operation&gt;.+)/(?P&lt;id&gt;\d+)" 部分,或者即使这样可以解决我的问题。但我认为我可以使用 ajax,虽然我不知道如何使用。

【问题讨论】:

    标签: python ajax django


    【解决方案1】:

    您需要在这里使用 Ajax。在锚标签上使用onclick 事件侦听器来表示喜欢/不喜欢,改为进行ajax 调用并根据响应更新计数。

    $('.like, .unlike').click(function(e){
      e.preventDefault();
      var url = $(this).attr('href'));
      // make a get call on this url, and update the total_likes based on response
      $.get(url, function( data ) {
        $(this).text(data.total_likes);  //something like that
      });
    });
    

    【讨论】:

    • 这很好用,但需要手动重新加载页面以更新“{% if post in likes %}”或“{% if not post in likes %}”部分。这些可以在点击时更新吗?
    • 您也可以使用 javascript 更新这些元素。更改 total_likes 后更新 classhref
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-17
    • 2013-07-08
    • 2019-07-25
    • 1970-01-01
    相关资源
    最近更新 更多