"POST /......... / ......... / HTTP/1.1" 405 0 - Django
У меня проблема, в моей работе мне нужно вставить систему лайков к опубликованным постам, но при нажатии на кнопку, которая должна поставить посту лайк, ничего не происходит и выходит эта ошибка... "POST /posts/like/ HTTP/ 1.1" 405 0
views.py
@ajax_required
@require_POST
@login_required
def post_like(request):
post_id = request.POST.get('id')
action = request.POST.get('action')
if post_id and action:
try:
post = Post.objects.get(id=post_id)
if action == 'like':
post.users_likes.add(request.user)
else:
post.users_likes.remove(request.user)
return JsonResponse({'status': 'ok'})
except:
pass
return JsonResponse({'status': 'error'})
urls.py
from django.urls import path, include
from . import views
app_name = 'posts'
urlpatterns = [
path('like/', views.post_like, name='like'),
]
index.html
{% with total_likes=post.users_likes.count users_likes=post.users_likes.all %}
<div class="post-info">
<div>
<span class="count">
<span class="total">{{ total_likes }}</span>
like{{ total_likes|pluralize }}
</span>
<a href="#" data-id="{{ post.id }}" data-action="{% if request.user in users_likes %}un{% endif %}like" class="like">
{% if request.user not in users_likes %}
Like
{% else %}
Unlike
{% endif %}
</a>
</div>
</div>
<div class="post-likes">
{% for user in users_likes %}
<div>
<p>{{ user.first_name }}</p>
</div>
{% empty %}
<p>No body likes this post yet</p>
{% endfor %}
</div>
{% endwith %}
<p>{{ post.id }}</p>
<a class="normal-text" href="{{ post.get_absolute_url }}">Discover more...</a>
</div>
</div>
ajax код
<script>
{% block domready %}
$('a.like').click(function(e){
e.preventDefault();
$.post("{% url 'posts:like' %}",
{
id: $(this).data('id'),
action: $(this).data('action')
},
function(data){
if (data['status'] == 'ok')
{
var previous_action = $('a.like').data('action');
// toggle data-action
$('a.like').data('action',
previous_action == 'like' ? 'unlike' : 'like');
// toggle link-text
$('a.like').text(
previous_action == 'like' ? 'Unlike' : 'Like');
// update total likes
var previous_likes = parseInt(
$('span.count .total').text());
$('span.count .total').text(previous_action == 'like' ? previous_likes + 1 : previous_likes -1);
}
}
);
});
{% endblock %}
</script>
Я не понимаю, где проблема... Я думал в урле, но не думаю
Из документации следует, что виноват ваш urls.py
- вы определяете шаблон "like/", но ничто не указывает маршрутизатору, что вы хотите, чтобы он имел префикс "posts/".
В приведенных там примерах для этого явно используется директива include
, а вы ничего подобного не делаете. Попробуйте:
from django.urls import include, path
from . import views
urlpatterns = [
path('posts/', include([
path('like/', views.post_like, name='like'),
# Other posts/... endpoints
])),
# path('users/', include([ ...
]