У меня есть эта простая кнопка Like, который хорошо работает при использовании @csrf_exempt
:Как вернуть новый токен csrf в ajax POST в Django?
шаблона
<p id="like_count"> {{ topic.likes }}</p>
<span data-type="topic" title="Like"> {% csrf_token %}
<i class="fa fa-thumbs-up" id="liket" name="{{topic.id}}">
Ajax
$(function(){
$('#liket').click(function(){
$.ajax({
type: "POST",
url: "/like/",
data: {
'topic_id': $(this).attr('name'),
'csrfmiddlewaretoken': '{{csrf_token}}'
},
success: tlikeSuccess,
dataType: 'html'
});
});
});
function tlikeSuccess(data, textStatus, jqXHR)
{
$('#like_count').html(data);
}
и просмотров:
#@csrf_exempt
def topic_like(request):
args = {}
if request.method == 'POST':
user = request.POST.get('user')
lu= request.user #User.objects.get(username= user)
topic_id = int(request.POST.get('topic_id'))
try:
liked_topic = Topic.objects.get(id = topic_id)
except:
liked_topic = None
if TopicLike.objects.filter(liker=request.user.id, topic=topic_id).exists():
liked_topic.likes -=1
liked_topic.save()
TopicLike.objects.filter(topic=topic_id, liker=request.user.id).delete()
else:
liked_topic.likes +=1
liked_topic.save()
newliker = TopicLike(topic=topic_id, liker=request.user.id)
newliker.save()
#args.update(csrf(request))
args['likes'] = str(liked_topic.likes)
return render(request, 'ajax_like.html', args)
Однако я не» t как это обходное решение, которое игнорирует CSRF, поскольку i t может быть уязвимым. С другой стороны, мне не удалось вернуть новый токен CSRF в шаблон, поэтому я ценю ваши подсказки для интеграции CSRF в эту кнопку.
[Django docs] (https://docs.djangoproject.com/en/1.8/ref/csrf/#ajax) предлагает предоставить токен csrf в заголовке вместо данных post. – Alasdair
@Alasdair, пожалуйста, дайте мне полный ответ. Я не знаю, как применять предложения документа. – Jand
Я думаю, что документы довольно ясны. Что вы пробовали? Что, по-вашему, отсутствует? Какую часть вы не понимаете? – Alasdair