Обновление объекта, связанного с двумя другими по foreignKey и OneToOneKey соответственно, не работает в django

Вот модель объекта, который я хочу обновить:

class Abonnement(models.Model):
    client = models.ForeignKey('Client', on_delete=models.CASCADE, related_name="abonnements")
    compteur = models.OneToOneField(Compteur, on_delete=models.CASCADE,related_name="abonnement")
    adresse = models.CharField(max_length=200, blank=True, null=True)
    point_service = models.CharField(max_length=200, null=True, blank=True)
    lat_machine = models.FloatField(default=0.0)
    lon_machine = models.FloatField(default=0.0)

Модель Client связана с этой моделью внешним ключом, а модель Compteur - ключом OneToOne
. Извлечение объекта из поля OneToOne не представляет проблемы. Но когда я пытаюсь обновить, это не работает
. Вот что я делаю в контроллере:

compteur = get_object_or_404(Compteur,pk=request.POST["deveui"])
a = compteur.abonnement
a.point_service = form.cleaned_data["pointservice"]
a.lat_machine = form.cleaned_data["latitude"]
a.lon_machine = form.cleaned_data["latitude"]
a.save()

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

compteur = get_object_or_404(Machine,pk=request.POST["deveui"])
a = Abonnement.objects.get(compteur=compteur)
a.point_service = form.cleaned_data["pointservice"]
a.lat_machine = form.cleaned_data["latitude"]
a.lon_machine = form.cleaned_data["latitude"]
a.save()

Возможно, ваш form.cleaned_data не содержит значений, которые вы ожидаете, потому что какая-то валидация не прошла (См. документацию: "Если ваши данные не прошли валидацию, словарь clean_data содержит только валидные поля" - https://docs.djangoproject.com/en/4.1/ref/forms/api/).

Кроме того, кажется странным, что вы присваиваете одно и то же значение ("широта") и a.lat_machine, и a.lon_machine.

Наконец, попробуйте получить журнал ошибок с сервера, когда вы отправляете форму. Если вы используете сервер разработки Django'd, вы должны быть в состоянии увидеть ошибки в терминале, из которого вы запускаете сервер.

Вернуться на верх