Django: база данных SQLite блокируется, когда я создаю подобную функцию на своей домашней странице - PullRequest
0 голосов
/ 28 декабря 2018

Я реализую функциональность Like в веб-приложении.Идея проста - перечислить количество постов (блогов) на домашней странице и добавить кнопку «Мне нравится» к каждому посту (блогу).Он работает нормально, когда я создаю его с обычным

<form action='{% url target %}' method='POST'>

Но когда я реализовал это с помощью вызова AJAX, он позволяет мне только понравиться или не понравиться конкретному сообщению (блогу) один раз. Один Мне понравился поств первый раз это работает, также когда мне не нравится тот же пост, он работает нормально, но когда мне снова нравится этот пост, он выдает django.db.utils.OperationalError: database is locked

Кроме того, когда мне нравится один и тот же пост несколько раз (от 4 до 5)это реагирует странным образом.Я захожу в петлю сообщений о симпатиях и антипатиях.

like_section.html

<form id="like-form{{ post.id }}">
    {% csrf_token %}
    <button type="submit" id="{{ post.id }}btn" name="like" value="{{ post.id }}" class="btn upvote">Like</button>
    <script type="text/javascript">
    {% for like in post.likes.all %}
      {% if like != user %}
        dislikingPost("{{ post.id }}btn");
      {% else %}
        likingPost("{{ post.id }}btn");
      {% endif %}
    {% endfor %}



    $(document).ready(function(event){
      $(document).on('click', '#{{ post.id }}btn', function(event){
        event.preventDefault();
        pk = $(this).attr('value');
        $.ajax({
          type: 'POST',
          url: '{% url "like_post" %}',
          data: {
            'id': pk,
            'csrfmiddlewaretoken': '{{ csrf_token }}'
          },

          success:function(response){
            $('#like-form{{ post.id }}').html(response['form'])
            // $('#{{ post.id }}btn').style.color = 'green';
          }, error: function(er, e){
            console.log(er.responseText);
          }
        });
      });
    });

    </script>
</form>

views.py:

def like_post(request):
    all_posts = Posts.objects.all()
    print("Insisde Like Post")
    print('ID coming from form is', request.POST.get('id'))
    post = get_object_or_404(Posts, id=request.POST.get('id'))  # for AJAX call
    context = {
        'all_posts': all_posts,
        'post': post
    }
    if post.likes.filter(id=request.user.id).exists():
        post.likes.remove(request.user)                 # Liking The Post
        print("DisLiking the post")
    else:
        post.likes.add(request.user)
        print("Liking the post")
    if request.is_ajax():
        print('Hey its an AJAX calls')    # TEsting AJAX request
        html = render_to_string('like_section.html', context, request=request)
        return JsonResponse({'form': html})

Примечание: 1. Я новичок в AJAX,2. Я знаю, что SQLite не может обрабатывать избыточные вызовы, но почему раньше он работал без вызовов AJAX.3. Я не предоставляю models.py и полный шаблон домашней страницы, и я не думаю, что они требуются.

1 Ответ

0 голосов
/ 28 декабря 2018

Проблема была не с кодом Django.Это был вызов ajax, который вызывал базу данных более одного раза одним нажатием кнопки.

Добавление event.stopImmediatePropagation(); ниже event.preventDefault(); в вызове ajax прекрасно работает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...