Как я могу получить значения Django Form ModelChoiceField из Class View обратно в шаблон, из которого они были получены

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

Экран будет выглядеть следующим образом: enter image description here

При нажатии кнопки 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.

Вернуться на верх