Как получить все поля связанного объекта 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})