Tuve un envío ajax (consulta GET ). Pero hace cambios en mi base de datos, por lo que las personas inteligentes me dijeron que debería usar POST en su lugar con {% csfr_token %} .
OBTENER consulta:
$(document).on('submit','#follow', function(e){ var $button = $(this).find('button'); e.preventDefault(); $.ajax({ url:'/event/{{ event.id }}/', data: "add={{ event.id }}", success:function(){ $('#follow').hide(); $('#unfollow').show(); } }) });vistas.py
... event = get_object_or_404(Event, id=event_id) user = request.user if request.GET.get('add'): event.users.add(user) event.save() if request.GET.get('remove'): event.users.remove(user) event.save() ... Así que agregué type:"post", y csrfmiddlewaretoken:$('input[name=csrfmiddlewaretoken]) a los datos, pero no sé qué usar en lugar de if request.GET.get('add'): y if request.GET.get('add'): . if request.POST.get('add'): pero no funciona. Entonces, ¿cómo usar eso if con valores POST?
UPD.
Ok, lo que tengo ahora... plantilla:
<form id="unfollow" {% if user not in event.users.all %}style="display:none;"{% endif %}> <input type="hidden" value="{{ event.id }}" name="remove"> <button type="submit" class="btn btn-warning btn-block">{% trans "Unfollow"%}</button> </form>...
$(document).on('submit','#unfollow', function(e){ var $button = $(this).find('button'); e.preventDefault(); $.ajax({ type:"post", url:'/event/{{ event.id }}/', data: { 'action': 'remove' }, success:function(){ $('#unfollow').hide(); $('#follow').show(); } }) });vistas.py:
def show_event(request, event_id): event = get_object_or_404(Event, id=event_id) user = request.user if 'action' in request.POST: if 'action' == 'add': event.users.add(user) event.save() elif 'action' == 'remove': event.users.remove(user) event.save() return render(request, 'events/event.html', {'event':event, 'user':user} No hay errores, pero no funciona. success:function() funciona bien pero no hay cambios en la base de datos. ¿Algún consejo?
También probé if request.POST('action') == 'add': pero no ayudó
Use un objeto para los datos {add: {{ event.id }}} en lugar de codificarlo como una cadena "add={{ event.id }}"
Entonces debería poder obtener el valor de request.POST con cualquiera de los siguientes:
request.POST['add'] request.POST.get('add', 'default') # use default if key doesn't exist Ya tiene event_id en la URL, por lo que realmente no necesita configurar add={{event.id}} . Sería mejor hacer algo como "
{'action': 'add'}Entonces, en su opinión, puede hacer algo como:
if 'action' in request.POST: if request.POST['action'] == 'add': # do something elif request.POST['action'] == 'remove': # do something elsePruebe lo siguiente si QueryDict está vacío:
data = request.data['action']