Как получить сохраненные пользователем данные формы модели и вернуть их пользователю?
Сценарий: Пользователь уже заполнил форму.
Что требуется: Как вернуть заполненную форму модели в Views.py? Я следовал нескольким руководствам здесь, таким как this, но безуспешно. Вот мой сокращенный код, содержащий соответствующие разделы:
models.py
APPROVAL_CHOICES = [
(None, 'Please select an option'),
("Yes", "Yes"),
("No", "No"),
]
class Direct(models.Model):
def __str__(self):
return self.registered_company_name
class Meta:
verbose_name_plural = 'Company Direct Application'
user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True")
registered_company_name = models.CharField(max_length=250, verbose_name="Company")
trading_name = models.CharField(max_length=250)
registered_company_address = models.CharField(max_length=250)
further_details_required = models.CharField(max_length=3, choices=APPROVAL_CHOICES, blank=True, verbose_name="Further Details Required")
forms.py
class CompanyDirectApplication(forms.ModelForm):
class Meta:
model = Direct
fields = ["registered_company_name", "trading_name", "registered_company_address"]
widgets = {
"registered_company_name": TextInput(attrs={'class': 'form-control'}),
"trading_name": TextInput(attrs={'class': 'form-control'}),
"registered_company_address": TextInput(attrs={'class': 'form-control'})
}
views.py
if Direct.objects.filter(further_details_required="Yes", user=request.user).exists():
form = CompanyDirectApplication()
form.instance.user = request.user
return render(request, 'direct_application.html', {'form': form})
#otherwise render a blank model form
else:
form = CompanyDirectApplication()
return render(request, 'direct_application.html', {'form': form})
HTML-шаблон отображает форму с помощью простого {{form.as_p}}
. Как мне вернуть заполненную форму модели в Views.py для рендеринга в моем шаблоне {{form.as_p}}
?
Вы можете использовать параметр instance для инициализации формы объектом:
directs = Direct.objects.filter(further_details_required="Yes", user=request.user)
if directs.exists():
form = CompanyDirectApplication(instance=directs.first())
else:
form = CompanyDirectApplication()
return render(request, 'direct_application.html', {'form': form})
Чтобы вернуть заполненную форму модели в Views.py, можно использовать параметр instance
при создании формы. Этот параметр указывает экземпляр модели, которым должна быть заполнена форма.
Вот пример того, как вы можете изменить свой код, чтобы вернуть заполненную форму:
# Get the Direct model instance that you want to populate the form with
direct = Direct.objects.get(further_details_required="Yes", user=request.user)
# Create the form instance, passing the Direct model instance as the `instance` parameter
form = CompanyDirectApplication(instance=direct)
# Pass the form instance to the template when rendering it
return render(request, 'direct_application.html', {'form': form})
Затем в своем шаблоне вы можете отобразить форму, используя {{form.as_p}}, как обычно. Форма должна быть предварительно заполнена данными из экземпляра модели Direct.
Примечание: В приведенном выше коде примера я предположил, что экземпляр модели Direct
, который вы хотите использовать для заполнения формы, существует в базе данных. Если это не так, вам нужно будет обработать случай, когда экземпляр модели Direct
не существует, например, отобразив сообщение об ошибке или перенаправив пользователя на другую страницу.
Измените представление следующим образом. Оно заполнит существующие данные.
if Direct.objects.filter(further_details_required="Yes", user=request.user).exists():
direct = Direct.objects.get(further_details_required="Yes", user=request.user)
form = CompanyDirectApplication(instance=direct)
return render(request, 'direct_application.html', {'form': form})
else:
form = CompanyDirectApplication()
return render(request, 'direct_application.html', {'form': form})