【问题标题】:How to update and save model's field in Django如何在 Django 中更新和保存模型的字段
【发布时间】:2020-11-20 00:11:57
【问题描述】:

以下是我的代码,每次我点击喜欢(或不喜欢)链接时,不喜欢和喜欢都会增加。 我是 django 的新手,非常感谢您的帮助。谢谢

这是我的models.py,

from django.db import models
from django.urls import reverse
# Create your models here.
class Movies(models.Model):
   Director=models.CharField(max_length=30)
   Cast_I=models.CharField(max_length=30)
   Cast_II=models.CharField(max_length=30)
   Name=models.TextField()
   ReleaseYear=models.IntegerField()
   ImdbRating=models.CharField(max_length=2)
   Genre=models.TextField(null=True)
   Language=models.CharField(max_length=20,null=True)
   Like=models.IntegerField()
   Dislike=models.IntegerField()
   def like_this_movie(self):
       self.Like+=1
       self.save()
       return reverse ('list',kwargs={})
   def dislike_this_movie(self):
       self.Dislike+=1
       self.save()
       return reverse ('list',kwargs={})

这是模板,

{% block content %}
<p>
<a href="{{ object.like_this_movie }}">Like</a>
<a href="{{ object.dislike_this_movie }}">Dislike</a>
</p>
{% endblock %}

这是我的视图类,

class MovieDetailView(DetailView):
    template_name='movie/detail.html'
    queryset=Movies.objects.all()

【问题讨论】:

    标签: python django django-models


    【解决方案1】:

    Django 中的模板不是这样工作的,你放在 {{ }} 中的所有内容都在服务器上呈现,然后页面被发送到客户端,所以不可能运行这样的函数。

    您必须对另一个运行 like_this_movie 的页面执行 AJAX 请求之类的操作,并将电影 ID 作为参数。要发送到 AJAX 请求,您可以将 Javascript 与 jQuery 结合使用。

    【讨论】:

    • 感谢您的回答。我会尝试使用 AJAX 请求。
    【解决方案2】:

    问题是每次加载页面时,两个值都会递增,因为您在每次调用中都调用了这两个函数。此链接将帮助您了解如何操作 => How to make user to Like/Dislike post only for once in Django?

    【讨论】:

      【解决方案3】:

      我已通过将 like_this_movie 和 dislike_this_movie 函数添加到我的 views.py 并更新我的 urls.py 和模板来解决我的错误。谢谢你们的宝贵答案。 视图.py,

      def like_this_movie(request,key):
          obj=Movies.objects.get(pk=key)
          obj.Like+=1
          obj.save()
          return redirect('/movie/list')
      def dislike_this_movie(request,key):
          obj=Movies.objects.get(pk=key)
          obj.Dislike+=1
          obj.save()
          return redirect('/movie/list')
      

      urls.py,

      urlpatterns=[
          path('list/<int:key>/like',like_this_movie,name='like'),
          path('list/<int:key>/dislike',dislike_this_movie,name='dislike')
      ]
      

      模板,

      <a href="{% url 'like' object.pk %}">Like</a>
      <a href="{% url 'dislike' object.pk %}">Dislike</a>
      

      【讨论】:

        【解决方案4】:

        现在我已经通过使用 jQquery AJAX 解决了这个问题,like_this_movie 和 dislike_this_movie 函数将 json 值返回给 ajax 请求。现在页面不会在我每次点击喜欢或不喜欢按钮时重新加载。谢谢你们的宝贵答案。 视图.py,

        def like_this_movie(request,key):
            obj=Movies.objects.get(pk=key)
            obj.Like+=1
            obj.save()
            return JsonResponse({'success':True,'content':'Like','Like':obj.Like})
        def dislike_this_movie(request,key):
            obj=Movies.objects.get(pk=key)
            obj.Dislike+=1
            obj.save()
            return JsonResponse({'success':True,'content':'Dislike','Dislike':obj.Dislike})
        

        urls.py,

        urlpatterns=[
            path('<int:key>/like',like_this_movie,name='like'),
            path('<int:key>/dislike',dislike_this_movie,name='dislike')
        ]
        

        detail.js

          document.addEventListener('DOMContentLoaded',()=>{
            document.querySelector('#likebtn').onclick=()=>{
              const request=new XMLHttpRequest;
              request.open('GET','like',true);
              console.log(request);
              request.onload=()=>{
                const data = JSON.parse(request.responseText);
                if ((data.success)&&(data.content=='Like')){
                  totalLike=data.Like;
                  likespan=document.querySelector('#likespan');
                  likespan.innerHTML=totalLike;
                  likebtn=document.querySelector('#likebtn');
                  likebtn.disabled = true;
                  dislikebtn.disabled=true;
                }
              }
              request.send();
              return false;
            }
            document.querySelector('#dislikebtn').onclick=()=>{
              const request=new XMLHttpRequest;
              request.open('GET','dislike',true);
              request.onload=()=>{
                const data = JSON.parse(request.responseText);
                if ((data.success)&&(data.content=='Dislike')){
                  totalDislike=data.Dislike;
                  dislikespan=document.querySelector('#dislikespan');
                  dislikespan.innerHTML=totalDislike;
                  dislikebtn=document.querySelector('#dislikebtn');
                  dislikebtn.disabled = true;
                  likebtn.disabled=true;
                }
              }
              request.send();
              return false;
            }
          })
        

        detail.html,

            <h4>
                <span id="likespan">{{object.Like}}</span>
                <button id="likebtn" type="submit" class="btn btn-primary">Like</button>
                <span id="dislikespan">{{object.Dislike}}</span>
                <button id="dislikebtn" type="submit" class="btn btn-primary">Dislike</button>
            </h4>
        

        【讨论】:

          猜你喜欢
          • 2012-12-23
          • 1970-01-01
          • 1970-01-01
          • 2015-09-14
          • 2011-06-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多