Как я могу перенаправить на ту же страницу после отправки формы с помощью Django и отобразить отправленные данные на той же странице?

Это моя функция просмотра на основе класса

Когда использование завершится, введите необходимые данные и нажмите кнопку отправки. Я хочу, чтобы страница перезагрузилась, чтобы пользователь мог увидеть отправленные им данные.

Я не хочу перенаправлять пользователя на другую страницу. Но приложение ведет себя по-другому.

Я пытаюсь понять, как я могу заставить это работать, пожалуйста

class homeView(View):
    def get(self, request):
        data = recipemeal.objects.all().order_by("-id")
        
        context ={
            "recipes":data,
            "form":RecipeForm()
        }
        return render(request, "index.html", context)
    
    def post(self, request):
        form = RecipeForm(request.POST)
        data = recipemeal.objects.all().order_by("-id")
        
        if form.is_valid():
            form.save(commit=True)
            return HttpResponseRedirect(reverse("home"))
        
        else:
            context = {
                    "recipes": data,
                    "form": RecipeForm()
                }
            return render(request, "index.html", context)


*************************************************************************
urlpatterns = [
    path("", views.homeView.as_view(), name="home"),
]

*********************************************************************
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h2>Hi there, my name is Wilkenson</h2>
    <section>
        <div class="container">
            <div>
                <form method="POST">
                    {% csrf_token %}
                    {{ form }}
                    <button class="btn" type="submit">Add Data</button>
                </form>
            </div>
            <div>
                <form action="/" method="POST">
                    {% csrf_token %}
                    <button class=" button generate-pdf">Generate Plan</button>
                </form>
            </div>

            {% if recipes %}
            <table>
                <tr>
                    <th>Recipe No.</th>
                    <th>Day-Time</th>
                    <th>Recipe Name</th>
                    <th>Description</th>
                    <th>Action</th>
                </tr>
                {% for item in recipes %}
                <tr>
                    <td>{{item.id}}</td>
                    <td>{{item.date}}</td>
                    <td>{{item.title}}</td>
                    <td>{{item.content}}</td>
                    <td><a href="">Update</a>/<a href="">Delete</a></td>
                </tr>
                {% endfor %}
            </table>
            {% endif %}
        </div>
    </section>
</body>
</html>

Если вы хотите, чтобы страница загружалась с обновленными данными после того, как пользователь отправит форму, вам не нужно перенаправлять, просто сохраните форму в if form.is_valid():, затем извлеките обновленный набор запросов и снова отрисуйте тот же шаблон

class homeView(View):
    def get(self, request):
        data = recipemeal.objects.all().order_by("-id")
        context = {
            "recipes": data,
            "form": RecipeForm()
        }
        return render(request, "index.html", context)

    def post(self, request):
        form = RecipeForm(request.POST)
        if form.is_valid():
            form.save()

        data = recipemeal.objects.all().order_by("-id")
        context = {
            "recipes": data,
            "form": form  # same form
        }
        return render(request, "index.html", context)

Таким образом, та же страница перезагружается с введенными данными, и пользователь не перенаправляется на другую страницу. Единственным недостатком является то, что обновление страницы после отправки может привести к тому, что браузер выдаст предупреждение о повторной отправке формы, если это не проблема, это решение работает нормально, иначе вы бы придерживались этого правила. с шаблоном перенаправления

примечание: вы также можете избежать перезагрузки всей страницы, отправив форму с помощью JavaScript с помощью AJAX (например, с помощью fetch или jQuery). Таким образом, динамически обновляется только раздел данных без полного обновления страницы, что обеспечивает более плавный пользовательский интерфейс, но требует написания небольшого фрагмента JS для отправки данных формы и обновления DOM новыми результатами

Это мой новый подход.

Но это работает не так, как ожидалось;

Когда я закрываю страницу и перезапускаю сервер разработки, в первый раз все работает отлично. Но после этого это не работает. Я, конечно, понятия не имею, что происходит.

class homeView(View):
    def get(self, request):
        data = recipemeal.objects.all().order_by("-id")
        
        context ={
            "recipes":data,
            "form":RecipeForm()
        }
        return render(request, "index.html", context)
    
    def post(self, request):
        form = RecipeForm(request.POST)
        
        if form.is_valid():
            form.save()
            
        data = recipemeal.objects.all().order_by("-id")
        context = {
                "recipes": data,
                "form": RecipeForm()
            }
        
        return render(request, "index.html", context)

Теперь это работает, спасибо вам за всю вашу помощь;

class homeView(View):
    def get(self, request):
        data = recipemeal.objects.all().order_by("-id")
        
        context ={
            "recipes":data,
            "form":RecipeForm()
        }
        return render(request, "index.html", context)
    
    def post(self, request):
        form = RecipeForm(request.POST)
        
        if form.is_valid():
            form.save()
            return redirect("home")

        data = recipemeal.objects.all().order_by("-id")
        
        context = {
                "recipes": data,
                "form": form
            }
        
        return render(request, "index.html", context)
Вернуться на верх