Django - CreateView form_valid() как я могу получить доступ к объектам внешнего ключа

Думаю, я усложняю ситуацию еще больше, потому что то, что я использую для внешнего ключа, имеет параметр Choice, и у меня внешний ключ настроен на отображение читаемого человеком выбора. По нему, похоже, и происходит поиск. Однако это кажется мне странным, потому что, когда я смотрю на возвращаемые данные, кажется, что они передают первичный ключ.

Возможно, какой-то код поможет: (в качестве оговорки, это 9-миллионная итерация просмотра, и в этот момент я, по крайней мере, экспериментировал с разными вещами)

views.py

    model = Ship
    fields = ['hull', 'name', 'debt']
    template_name = 'crew/ship.html'
    success_url = reverse_lazy('crew_app:ship_list')

    def form_valid(self, form):
        hul = form.instance.hull
        hp = get_object_or_404(ShipHull, hull=hul)
        form.instance.hull_points_max = hp.hull_points
        form.instance.hull_points_cur = hp.hull_points
        return super().form_valid(form)

models.py

class ShipHull(models.Model):
    SHIP_TYPE = (
        ('WF', 'Worn Freighter'),
        ('RTT', 'Retired Troop Transport'),
        ('SAV', 'Strange Alien Vessel'),
        ('UPS', 'Upgraded Shuttle'),
        ('RSS', 'Retired Scout Ship'),
        ('RSV', 'Repurposed Science Vessel'),
        ('BMV', 'Battered Mining Ship'),
        ('UMC', 'Unreliable Merchant Cruiser'),
        ('FDV', 'Former Diplomatic Vessel'),
        ('ALC', 'Ancient Low-Tech Craft'),
        ('BSW', 'Built from Salvaged Wrecks'),
        ('RMS', 'Retired Military Patrol Ship'),
    )
    hull = models.CharField(max_length=200, choices=SHIP_TYPE)
    traits = ArrayField(models.CharField(max_length=200), blank=True)
    hull_points = models.IntegerField()
    debt = models.CharField(max_length=200)
    roll = IntegerRangeField(null=True)

    def __str__(self):
        return self.get_hull_display()


class Ship(models.Model):

    owner = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True)
    name = models.CharField(max_length=300,)
    debt = models.CharField(max_length=4,)
    hull = models.ForeignKey(ShipHull, on_delete=models.CASCADE, null=True)
    hull_points_max = models.IntegerField(null=True)
    hull_points_cur = models.IntegerField(null=True)
    upgrades = ArrayField(models.CharField(max_length=200), blank=True)

    def __str__(self):
        return self.name 

Вот что я вижу в POST:

hull: 1
name: Serenity
debt: 23

Если я переключаюсь на попытку использовать id, я получаю ошибку типа, что он не может быть найден. Вот трассировка:

Так что я пытаюсь понять, как правильно искать это значение.

Поскольку я поделился трассировкой при переключении на id, вот представление с id: views.py (снова, но уже с измененным id)

class CreateShipView(CreateView):
    model = Ship
    fields = ['hull', 'name', 'debt']
    template_name = 'crew/ship.html'
    success_url = reverse_lazy('crew_app:ship_list')

    def form_valid(self, form):
        hul = form.instance.hull
        hp = get_object_or_404(ShipHull, id=hul)
        form.instance.hull_points_max = hp.hull_points
        form.instance.hull_points_cur = hp.hull_points
        return super().form_valid(form)

Вы передаете экземпляр объекта в поле int. Вы пробовали:

hp = get_object_or_404(ShipHull, id=hul.id)

Или еще лучше:

hp = get_object_or_404(ShipHull, pk=hul.pk)
Вернуться на верх