Django Ajax - POST-запрос выполнен успешно, данные не сохранены в БД - PullRequest
0 голосов
/ 10 июня 2018

Я использую модальный загрузчик, чтобы позволить пожарному обновлять свой статус в приложении, над которым я работаю.На модале есть кнопки, которые при нажатии делают запрос POST.csrf tokens are disabled for testing purposes

models.py

class Firefighter(models.Model):  

  STATUS_OPTIONS = (
    ('AV', 'Available'),
    ('OD', 'On Duty'),
    ('UN', 'Unavailable'),
    ('LV', 'Leave'),
  )

  first_name = models.CharField("First Name", max_length = 200)
  last_name = models.CharField("Last Name", max_length = 200)
  status = models.CharField("Status", max_length = 20 , choices=STATUS_OPTIONS, default='Available')

views.py

def updateStatus(request, id):
  from django.http import JsonResponse
  if request.method=='POST' and request.is_ajax():
    try:
      obj = Firefighter.objects.get(id=id)
      obj.data_attr = request.POST['status']
      obj.save()
      return JsonResponse({'status':'Record Saved'})
    except Firefighter.DoesNotExist:
      return JsonResponse({'status':'Record does not exist'})
  else:
      return JsonResponse({'status':'Invalid POST request'})

Возвращает ответ Record Saved JSON при запуске.

urls.py

urlpatterns = [
    url(r'^$', views.home, name='home'),
    url(r'^status/$', views.status, name='status'),
    url(r'^status/update/(?P<id>\d+)/$', views.updateStatus, name='update'),

button jQuery

$('#btnAvailable').on('click', function() {
    // You gotta include the csrf_token in your post data
    $.post(`/status/update/${clickedID}/`, {'status': 'AV'}, function() {
      $('#change-status').modal('hide');
      location.reload(true)
    });
  });

Все работает как надо, chrome не выдает консольных ошибок для запроса POST, но status не сохраняется в БД.Например, для /status/update/22/ их статус в настоящее время установлен на UN (Недоступно), для запроса на отправку должно быть установлено значение AV (Доступно), однако в БД состояние никогда не изменяется.

1 Ответ

0 голосов
/ 10 июня 2018

Из того, что я вижу, вы вообще не устанавливаете status, вы изменяете атрибут с именем data_attr (присоединяющий его во время выполнения), а затем вызываете save, что, как и ожидалось, ничего не сохраняет в БД.

Просто измените data_attr на status, и вы можете пойти

def updateStatus(request, id):
  from django.http import JsonResponse
  if request.method=='POST' and request.is_ajax():
    try:
      obj = Firefighter.objects.get(id=id)
      obj.status = request.POST['status']
      obj.save()
      return JsonResponse({'status':'Record Saved'})
    except Firefighter.DoesNotExist:
      return JsonResponse({'status':'Record does not exist'})
  else:
      return JsonResponse({'status':'Invalid POST request'})

Также у вас есть «Доступно» по умолчанию для вашего статуса, в то время как ваш выбор другой (AV, OD, ...).

Это также должно быть исправлено, что-то вроде

STATUS_AVAILABLE = 'AV'
STATUS_ON_DUTY = 'OD'
STATUS_UN_AVAILABLE = 'UV'
STATUS_ON_LEAVE = 'OL'

STATUS_OPTIONS = (
    (STATUS_AVAILABLE, 'Available'),
    (STATUS_ON_DUTY, 'On Duty'),
    (STATUS_UN_AVAILABLE, 'Unavailable'),
    (STATUS_ON_LEAVE, 'Leave'),
  )
status = models.CharField(..., choices=STATUS_OPTIONS, default=STATUS_AVAILABLE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...