Как получить все поля связанного объекта Django

У меня есть две модели:

class Checklist(models.Model):
    author = models.ForeignKey(User, null=True, on_delete=models.SET_NULL)
    client_name = models.ForeignKey(Client, on_delete=models.CASCADE,
                                     related_name='details')
    fieldA = models.CharField(max_length=25, blank=True, null=True)
    fieldA_Check= models.BooleanField(default=False)
    fieldB = models.CharField(max_length=25, blank=True, null=True)
    fieldB_Check= models.BooleanField(default=False)


class Client(models.Model):
    client_fieldA = models.CharField(max_length=25)
    client_fieldB = models.CharField(max_length=25)
    client_fieldC = models.CharField(max_length=25)

Теперь я пытаюсь изменить значения полей экземпляра клиента через контрольный список, используя следующий код:

@login_required
def create_order(request, pk):
    instance = get_object_or_404(CheckList, id=pk)
    form = myForm(request.POST or None, instance=instance)
    if form.is_valid():
        form.save()
        messages.success(request, 'Test message')
        return get_PDF_order(request, pk)
    return render(request, 'templates/create_order.html', {'form': form})

И это работает, но только один раз. Данные сохраняются и я получаю pdf файл с этими данными, но последующие попытки ничего не меняют. Значение поля остается прежним. Я предполагаю, что это происходит потому, что я работаю с экземпляром Checklist, а не с Client. Итак, мои вопросы таковы: 1) Как я могу получить доступ ко всем полям Client (набор всех файлов) через Checklist? 2) Хотя мой код некорректен - почему он работает (один раз)? Я имею в виду, почему он сохраняется в первый раз?

Заранее всем спасибо!

Вы передаете ему всегда один и тот же экземпляр, так что происходит то, что вы, вероятно, перезаписываете одну и ту же запись снова и снова. Я бы рекомендовал вам разделить это, используя предоставленные django общие представления на основе классов CreateView и UpdateView.

Хватит изобретать колесо, используйте представления на основе классов. В долгосрочной перспективе это принесет большие плоды.

Чтобы формализовать ответ, instance фактически является экземпляром модели, на которой основана форма. Таким образом, в вашем случае вы не можете передать экземпляр CheckList форме, основанной на Client
. В любом случае, поскольку у вас есть идентификатор CheckList, вы можете легко получить Client, и код для вашего представления будет таким:

@login_required
def create_order(request, pk):
    instance = get_object_or_404(CheckList, id=pk)
    form = myForm(request.POST or None, instance=instance.client_name)
    if form.is_valid():
        form.save()
        messages.success(request, 'Test message')
        return get_PDF_order(request, pk)
    return render(request, 'templates/create_order.html', {'form': form})
Вернуться на верх