Django AJAX обновить модель - PullRequest
0 голосов
/ 30 мая 2019

У меня проблема с простой задачей, которую я хочу выполнить. Я хочу загрузить список моделей, и когда пользователь нажимает кнопку, я хочу редактировать два поля выбранного экземпляра модели.

Я оставляю свою модель:

class Enfermos(models.Model):
    TIPO_ANIMAL = [
        ('terneros', 'Terneros'),
        ('terneras', 'Terneras'),
        ('vaquillas', 'Vaquillas'),
        ('toros', 'Toros'),
        ('vacas_viejas', 'Vacas Viejas'),
    ]
    tipo = models.CharField(choices=TIPO_ANIMAL, max_length=20)
    potrero = models.ForeignKey('campo.Potrero', on_delete=models.DO_NOTHING)
    enfermedad = models.ForeignKey('Enfermedad', on_delete=models.DO_NOTHING)
    fecha = models.DateTimeField(default=timezone.now)
    descripcion = models.CharField(null=True, blank=True, max_length=80, help_text='Si considera necesario agregar alguna descripción del animal enfermo aquí lo puede hacer. De lo contrario dejar vacio.')
    ESTADO = [
        ('curado', 'curado'),
        ('muerto', 'muerto'),
        ('enfermo', 'enfermo'),
    ]
    estado = models.CharField(choices=ESTADO, max_length=10, default='enfermo')

    def __str__(self):
        return 'Un ' + self.tipo + ' con: ' + self.enfermedad.nombre_enfermedad

Значительная часть моего шаблона:

<div class="container" style="min-height: 100%;height: 100%;">
    <div class="row justify-content-center">
        <div class="col-10">
            <div class="py-3">
                <h2>Panel de gestion de animales enfermos</h2></div>
                {% for e in enfermos %}
                    <div class="row" style="border: double; margin-bottom: 20px; padding: 10px;">
                        <div class="col-8">
                            <h3>{{ e }}</h3>
                            <span id="enfermo_{{ e.id }}" style="display: none;">{{ e.id }}</span>
                        </div>
                        <div class="col-2">
                            <button data-enfermo-id="{{ e.id }}" type="button" class="btn btn-primary c_curo">Curado</button>
                        </div>
                        <div class="col-2">
                            <button data-enfermo-id="{{ e.id }}" type="button" class="btn btn-danger c_murio">Muerto</button>
                        </div>
                    </div>
                {% endfor %}
            </div>
        </div>
    </div>
</div>

{# aca viene magia de jquery, necesaria porque django no tiene frontend :( #}
<script>
    $(".c_curo").on("click", function (e) {
        e.preventDefault();
        var url = "{% url 'animal:curar-enfermo' %}";
        var e_id = '#enfermo_'+$(this).attr('data-enfermo-id');
        var enfermo_id = $(e_id).text();
        console.log(enfermo_id);
        $.ajax({
            url: url,
            data: {
              'enfermo': enfermo_id
            },
            success: function (data) {
                console.log(data)
            }
        });
    });
</script>

Вид:

def curarEnfermo(request):
    enfermo_id = request.GET.get('enfermo')
    enfermo = Enfermos.objects.get(id=enfermo_id)
    enfermo.estado = 'curado'
    enfermo.fecha = timezone.now
    enfermo.save()
    return JsonResponse({'success': 'true'})

И связанный URL:

path('ajax/enfermedad/curar', views.curarEnfermo, name='curar-enfermo'),

Если я запускаю его в режиме отладчика, кажется, что все работает безупречно, вплоть до точки сохранения. Экземпляр модели извлекается, и поля редактируются, но при выполнении инструкции enfermo.save() (в представлении) возникает внутренняя ошибка сервера, которая сообщает:

Ошибка типа в / ajax / enfermedad / curar ожидаемая строка или байты объект

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