【问题标题】:How to fix matchong query does not exist error?如何修复匹配查询不存在错误?
【发布时间】:2020-11-16 07:22:42
【问题描述】:

我一直在使用 django 和 ajax 开发一个类似系统,这个类似系统与 instagram 的系统非常相似。完成代码后,我开始收到Post matching query does not exist 错误,这很痛苦。我在我的代码中没有看到错误,但我认为问题出在 views.py 文件上,因为回溯在那里触发了一行。我该如何解决这个错误?

models.py

class Post(models.Model):
      text = models.CharField(max_length=200)
      user = models.ForeignKey(User, on_delete=models.CASCADE, default='username')
      liked = models.ManyToManyField(User, default=None, blank=True, related_name='liked')

      def __str__(self):
        return str(self.id)

views.py (upload view 上传表单,home 显示上传的表单,like_post 是负责点赞和不喜欢帖子的视图,home_serialized os 是包含json的视图,这样当点赞按钮时页面不会重新加载点击)

def upload(request):
      print("toro")
      if request.method == 'POST':
        print("caballo")
        form = PostForm(request.POST)
        if form.is_valid():
          instance = form.save(commit=False)
          instance.user = request.user
          instance.save()
          return redirect('home')
          print('succesfully uploded')
      else:
        form = PostForm()
        print('didnt upload')
      return render(request, 'home.html', {'form': form})

def home(request):
    contents = Post.objects.all()
    args = {
        'contents': contents,
    }
    return render(request, 'home.html', args)

def like_post(request):
    user = request.user
    if request.method == 'POST':
        pk = request.POST.get('post_pk')
        post_obj = Post.objects.get(pk=pk)

        if user in post_obj.liked.all():
            post_obj.liked.remove(user)
        else:
            post_obj.liked.add(user)

    return HttpResponse()

def home_serialized(request):
    data = list(Post.objects.values())
    return JsonResponse(data, safe=False)


urls.py

urlpatterns = [
    path('', views.home, name='home'),
    path('upload', views.upload, name='upload'),
    path('like/', views.like_post, name='like-post'),
    path('serialized/', views.home_serialized, name='serialized-view'),
]

home.html

    <form method='post'  action="{% url 'upload' %}">
        {% csrf_token %}
        <input type="text" name="text" placeholder="Add a comment..." required="" id="id_text">
        <button class="submit-button" type="submit">Save</button>
    </form>
    {% for content in contents %}
        {% if content %}
        <ul class="list-group">
            <li class="list-group-item">{{ content.text }}</li>
            <form action="{% url 'like-post' %}" class='like-form' method="POST" id={{content.id}}>
                {% csrf_token %}
                <input type='hidden' name="post_ok" value="{{ content.ok }}">
                <button class='like-btn{{ content.id }}'>
                  {% if request.user in content.liked.all %}
                      Unlike
                  {% else %}
                      Like
                  {% endif %}
                </button>
              </form>
              <strong>{{ content.liked.all.count }}</strong>
        </ul>
        {% endif %}
    {% endfor %}
    <script type='text/javascript'>
        $(document).ready(function(){
            $('.like-form').submit(function(e){
              e.preventDefault()
              console.log('works')
              const post_id = $(this).attr('id')
              console.log(this)
              console.log(post_id)
              const likeText = $(`.like-btn${post_id}`).text()
              console.log(likeText)
              const trim = $.trim(likeText)
              console.log(trim)
              const url = $('.like-form').attr('action')
              console.log(url)

              $.ajax({
                type: 'POST',
                url: url,
                data : {
                  'csrfmiddlewaretoken': $('input[name=csrfmiddlewaretoken]').val(),
                  'post_pk': post_id,
                },
                success: function(error){
                  console.log('success')

                  $.ajax({
                    type: 'GET',
                    url: 'http://127.0.0.1:8000/serialized/',
                    success: function(response){
                      console.log(response)
                      $.each(response, function(index, element){
                        console.log(index)
                        console.log(element.content)
                        if (post_id == element.id) {
                          if(trim == 'Like') {
                            console.log('unlike')
                            $(`.like-btn${post_id}`).html('Unlike')
                          } else if (trim == 'Unlike') {
                            console.log('like')
                            $(`.like-btn${post_id}`).html('Like')
                          } else {
                            console.log('ups')
                          }
                        }
                      })
                    },
                    error: function(error){
                      console.log('error')
                    }
                  })
                },
                error: function(error){
                  console.log('error', error)
                }
              })
            })
        });
    </script>

追溯

Traceback (most recent call last):
  File "C:\Users\MaríaPaola\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "C:\Users\MaríaPaola\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Users\MaríaPaola\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\MaríaPaola\projects\nwpc\like\views.py", line 65, in like_post
    post_obj = Post.objects.get(pk=pk).exists()
  File "C:\Users\MaríaPaola\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\db\models\manager.py", line 82, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "C:\Users\MaríaPaola\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\db\models\query.py", line 415, in get
    raise self.model.DoesNotExist(
like.models.Post.DoesNotExist: Post matching query does not exist.

【问题讨论】:

    标签: javascript json django ajax django-models


    【解决方案1】:

    我不确定它在回溯中说了什么。如果你能提供它,也许它会更有意义。但我认为这是因为 post_obj = Post.objects.get(pk=pk) 之类的 def like_post(request)函数。

    具有给定主键的帖子不存在。你可以做的是检查pk是否存在。

    if Post.objects.filter(pk=pk).exists():
        # it exist
    

    或者你可以使用try except 方法

    try:
        post_obj = Post.objects.get(pk=pk)
    
        if user in post_obj.liked.all():
            post_obj.liked.remove(user)
        else:
            post_obj.liked.add(user)
    except:
        # what happens if post does not exist
    

    【讨论】:

    • 对不起,我忘了添加回溯,但我现在才添加!
    • 别介意你的代码对我来说很完美!我使用 if 语句使用了您提到的第一种情况。另外如何添加ajax来计算喜欢?目前必须刷新页面才能计算喜欢。
    猜你喜欢
    • 1970-01-01
    • 2011-09-25
    • 2013-07-22
    • 2015-04-20
    • 2021-07-26
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 2012-12-19
    相关资源
    最近更新 更多