当前位置: 首页 > 面试题库 >

我自己的喜欢按钮:Django + Ajax-如何?

孙成益
2023-03-14
问题内容

因此,我一直无法将这种视图转换为Ajax调用:

def company_single(request, slug):
    company = get_object_or_404(CompanyProfile, slug=slug)
    company_list = CompanyProfile.objects.get(slug=slug)

    try:
        tcompany = CompanyLikes.objects.get(company=company_list)
        total_likes = tcompany.likes
        user_liked = CompanyLikes.objects.get(user=request.user)
    except:
        total_likes = 0


    instance, created = CompanyLikes.objects.get_or_create(company=company_list)
    likes_form = CompanyLikesForm(request.POST or None, instance=instance)

    if likes_form.is_valid():
        this = likes_form.save(commit=False)
        try:    
            if user_liked:
                this.likes -=1
                this.user.remove(request.user)
        except:
            this.user.add(request.user)
            this.likes += 1
        this.save()

    return render_to_response('company.html', locals(), context_instance=RequestContext(request))

我想我需要jQuery和JSON,但是我不确定如何在此处实现它以便为我的网站创建自己的“赞按钮”。有什么想法/建议吗?


问题答案:

我举一个例子。您只需从中学习并进行相应的更改。

myapp.models.py (简化的公司模型):

from django.db import models
from django.contrib.auth.models import User
from django.template.defaultfilters import slugify


class Company(models.Model):
    name = models.CharField(max_length=255)
    slug = models.SlugField()
    likes = models.ManyToManyField(User, related_name='likes')

    @property
    def total_likes(self):
        """
        Likes for the company
        :return: Integer: Likes for the company
        """
        return self.likes.count()

    def save(self, *args, **kwargs):
        self.slug = slugify(self.name)
        super(Company, self).save(*args, **kwargs)

myapp.urls.py (视图的URL):

url(r'^like/$', 'myapp.views.like', name='like'),

myapp.views.py (查看):

from django.http import HttpResponse
try:
    from django.utils import simplejson as json
except ImportError:
    import json
from django.shortcuts import get_object_or_404
from django.contrib.auth.decorators import login_required
from django.views.decorators.http import require_POST

from myapp.models import Company


@login_required
@require_POST
def like(request):
    if request.method == 'POST':
        user = request.user
        slug = request.POST.get('slug', None)
        company = get_object_or_404(Company, slug=slug)

        if company.likes.filter(id=user.id).exists():
            # user has already liked this company
            # remove like/user
            company.likes.remove(user)
            message = 'You disliked this'
        else:
            # add a new like for a company
            company.likes.add(user)
            message = 'You liked this'

    ctx = {'likes_count': company.total_likes, 'message': message}
    # use mimetype instead of content_type if django < 5
    return HttpResponse(json.dumps(ctx), content_type='application/json')

模板:

<input type="button" id="like" name="{{ company_slug }}" value="Like" />

<script>
$('#like').click(function(){
      $.ajax({
               type: "POST",
               url: "{% url 'like' %}",
               data: {'slug': $(this).attr('name'), 'csrfmiddlewaretoken': '{{ csrf_token }}'},
               dataType: "json",
               success: function(response) {
                      alert(response.message);
                      alert('Company likes count is now ' + response.likes_count);
                },
                error: function(rs, e) {
                       alert(rs.responseText);
                }
          }); 
    })
</script>

在模板中使用url标签的一些说明:

  • 如果在这样的URL名称周围Django < 1.3使用url不带引号的标签{% url like %}
  • 如果是Django > 1.3 and < 1.5这样,您应该添加{% load url from future %} at top level of your template and enclosed your URL name with quotes as I have done in my answer
  • 如果是,Django >= 1.5则只需删除{% load url from future %}并用引号括起来的URL名称{% load url from future %}标记为已弃用,并将在以下位置删除Django 1.9


 类似资料:
  • 问题内容: 我有产品,用户和喜欢的模特。用户可以喜欢产品。我正在尝试实现一个简单的“喜欢”按钮,单击该按钮即可使用户喜欢产品。然后,“喜欢”按钮转换为“不一样”按钮,从而允许用户对产品进行不一样。非常简单。 我已经为上述实现了模型/控制器逻辑。我对javascript / ajax不太满意,并且想知道实现上述功能的最佳方法是什么。我希望通过ajax处理喜欢/不喜欢的动作。我正在为我的应用程序使用R

  • 我在一个网站上工作,我有问题,喜欢脸谱网的Buttom,当有人做一个帖子时,它应该显示喜欢的按钮,但我没有看到它 我看到一个类似的问题,其中一个用户说如果我们使用Facebook LINTER- 这是我从链接中得到的 打开应修复的图形警告 > 推断属性:应该显式提供'og:url'属性,即使可以从其他标记推断值。 推断属性:应明确提供“og:title”属性,即使可以从其他标记推断值。 推断属性:

  • 我想使用的方法获取http://en.wikipedia.org的内容。 我发现en.wikiepdia.org同时有IPv4和IPv6地址: 如何使用IPv6地址访问该站点?

  • 问题内容: 是否可以在一个查询中将多个SQL LIKE通配符串在一起-像这样? 目的是查找同时包含通配符但没有特定顺序的记录。 问题答案: 正确的SQL语法是:

  • 问题内容: 我有一些Django可以很好呈现的HTML。我想单击HTML上的按钮,并在视图中触发事件。 看起来按钮并未引起触发。我不确定自己在做什么错。 这是我的代码: 这是我的: 问题答案: 为什么没有直接使用该事件? 试试这个: 如果按钮是动态创建的,那么您可能想使用该函数将事件处理程序附加到元素: 尝试使用以下URL来包含JQuery库:

  • 问题内容: 假设我们正在使用关键字执行搜索:keyword1,keyword2,keyword3 数据库中有“名称”列的记录: 现在查询: 它会选择记录:1,2,3(按此顺序),但我想按示例在关键字中进行排序, 因此应按关键字列出:1,3,2(因为我想在搜索后搜索“ Doe”搜索“约翰”) 我当时在想, 但是用另一种方式订购它会容易得多(实际查询时间很长) 有什么技巧可以创建这样的订单? 问题答案