Как я могу получить значения Django Form ModelChoiceField из Class View обратно в шаблон, из которого они были получены
Я пытаюсь отобразить список тестов, выбрать один из них с помощью формы ModelChoiceField, а затем отобразить информацию о выбранном тесте на том же шаблоне, на котором находится ModelChoiceField. (2 поля - ID номер и название) в виде ссылки. В общем, вы выбираете тест, он появляется под ModelChoiceField в виде ссылки, а затем вы нажимаете на нее, чтобы перейти к подробному экрану. Я могу захватить информацию о выбранном выборе в представлении класса в form_valid, но я не знаю, как вернуться к шаблону с этой новой информацией. Пробовал различные подходы с контекстом и т.д., но ничего не помогает.
Экран будет выглядеть следующим образом:

При нажатии кнопки select выбранный тест появится на том же экране. Мне нужен доступ и к имени, и к номеру id, которые я получаю в form_valid
# forms.py
class TestBrowseForm(forms.Form):
choice = forms.ModelChoiceField(
Universal_Test_File.objects.all().order_by('test_name'), to_field_name="service_id")
# views.py
class ListTests(FormView):
model = Universal_Test_File
context_object_name = "testlist"
form_class = TestBrowseForm
template_name = "lab/list_tests.html"
success_url = '/list_tests/'
def form_valid(self, form):
# choice is a queryset with both service_id and testname so we need to specify service_id
choice = form.cleaned_data.get("choice")
## I want to display the test_name and link to service_id
print(choice.service_id)
print(choice.test_name)
return super().form_valid(form)
#models.py
class Universal_Test_File(models.Model):
service_id = models.CharField(max_length=200, unique=True)
test_name = models.CharField(max_length=200)
specimen = models.CharField(max_length=200, blank=True)
def __str__(self):
return self.test_name
Вы должны сделать POST запрос к тому же представлению, в котором вы находитесь, с некоторым дополнительным контекстом, 'choice' в вашем случае, как я вижу. Вы можете передать его из kwargs с помощью get_context_data.
class ListTests(FormView):
...
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
if 'choice' in self.kwargs:
some_id = self.kwargs['choice'] # or kwargs
context['extra_file'] = Universal_Test_File.objects.get(id=some_id)
return context
Затем в шаблоне:
{% if extra_file %}
# Your detailed content
{% endfor %}
Это зависит от того, как вы запрашиваете нужный вам объект. Вы определенно не должны использовать form_valid для этого, потому что это должно быть только для валидации формы (это может пересечь ваши дальнейшие действия).
Я настоятельно рекомендую использовать простой JS в качестве следующего шага (htmx идеально подходит для этой работы, я считаю), чтобы использовать его без обновления сайта.
Я решил использовать совершенно другой подход, так как тот, который я принял, кажется более подходящим для JS.