Как отобразить дополнительный контекст и поля формы одновременно в шаблоне django, используя представление на основе классов?

Я пытаюсь отобразить дополнительный контекст на странице, но когда я добавляю метод get_context_data, то отображается контекст, но не поля формы. Это происходит потому, что когда я нажимаю на ulr, который запускает представление ниже, метод get по умолчанию или до полей формы? Я не понимаю, почему формы исчезают, когда этот метод присутствует в представлении SolutionCreate, действительно все контекстные данные отображаются

 template 

{% extends "base.html" %}
{% block content %}
    <div class="container">
        <div class="row">
            <div class="col-sm">
                <form action="" method="POST">
                    <table>
                        {% csrf_token %}
                        {{ form.as_p }}
                    </table>
                    <input type="submit" class="btn btn-primary" value="Submit">
                </form>
            </div>
            <div class="col-sm">
                {{ context }}
                <h5>Problem:</h5>
                {% for pr in prb %}
                    <h5>Problem: {{ pr.title }}</h5>
                    <h6>Description</h6>
                    <li class="list-group-item">{{ pr.description }}</li>
                    <p>
                    </p>
                    <h6>Risks</h6>
                    <li class="list-group-item">{{ pr.risks }}</li>
                    <p>
                    </p>
                    <h6>Parts</h6>
                    <li class="list-group-item">{{ pr.parts }}</li>
                    <p>
                    </p>
                    <h6>Causes</h6>
                    <li class="list-group-item">{{ pr.causes }}</li>
                    <p>
                    </p>
                    <h6>Published</h6>
                    <li class="list-group-item">{{ pr.published }}</li>
                    <p>
                    </p>
                    <a href="{% url 'delete_problem' pr.pk %}"
                       class="btn btn-warning"
                       role="button"
                       aria-pressed="true">Delete</a>
                    <a href="{% url 'update_problem' pr.pk %}"
                       class="btn btn-warning"
                       role="button"
                       aria-pressed="true">Update</a>
                    <p>
                    </p>
                {% endfor %}
            </div>
        </div>
    </div>
{% endblock content %}


view

class SolutionCreate(CreateView):
    model = Solution
    template_name = 'analysis/create_solution.html'

    fields = [
        'problem',
        'research',
        'solutions',
        'resources',
        'plan',
        'test'
    ]

    def post(self, request, *args, **kwargs):
        form = SolutionForm(request.POST)
        if form.is_valid():
            form.save(commit=True)
            return HttpResponseRedirect('/saved/')

        return render(request, self.template_name, {'form': form})
    
    def get_context_data(self, *args, **kwargs):
        prb = Problem.objects.select_related()
  
        return {'prb': prb}

get_context_data - это метод родительского класса. Если вы переопределите его, вам все равно придется вызвать родительский метод, который и добавляет форму в контекст. Вы делаете это, вызывая super() внутри собственного метода, чтобы получить данные контекста, а затем добавляете свои собственные:

def get_context_data(self, *args, **kwargs):
    context = super().get_context_data(*args, **kwargs)
    context['prb'] = Problem.objects.select_related()
    return context

Обратитесь к документации по добавлению дополнительного контекста, чтобы узнать, как следует использовать get_context_data.

Это сработало для меня в аналогичном сценарии

def get_context_data(self, *args, **kwargs):
    context = super().get_context_data(**kwargs)
    prb = Problem.objects.select_related()
    context.update({'prb': prb})

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