Python Django-带表单的ListView,如何重定向回表单页面?
因此,我有一个带有练习列表的ListView(分页为每页1个)。在每个页面中,我几乎没有用户需要填写的输入。我设法找到了如何将ListView附加到表单的解决方案,但我找不到如何在提交后保持在同一页面上的解决方案 网址:Python Django-带表单的ListView,如何重定向回表单页面?,python,django,forms,listview,Python,Django,Forms,Listview,因此,我有一个带有练习列表的ListView(分页为每页1个)。在每个页面中,我几乎没有用户需要填写的输入。我设法找到了如何将ListView附加到表单的解决方案,但我找不到如何在提交后保持在同一页面上的解决方案 网址: urlpatterns = [ path('programs/', ProgramListView.as_view(), name='web-programs'), path('programs/<int:pk>/', ExerciseListVie
urlpatterns = [
path('programs/', ProgramListView.as_view(), name='web-programs'),
path('programs/<int:pk>/', ExerciseListView.as_view(), name='program-detail'),
path('data/', views.add_data, name='data-submit'),
template.html:
{% extends "program/base.html" %}
{% load crispy_forms_tags %}
{% block content %}
<h3> Program Exercises List </h3>
{% for exercise in exercises %}
<article class="media content-section">
<div class="media-body">
<div class="article-metadata">
{% if user.is_superuser %}
<a class="btn btn-secondary btn-sm mt-1 mb-1" href="{% url 'exercise-update' exercise.id %}">Update</a>
<a class="btn btn-danger btn-sm mt-1 mb-1" href="{% url 'exercise-delete' exercise.id %}">Delete</a>
<p class="article-content">{{ exercise.name }}</p>
{% else %}
<p class="article-content">{{ exercise.name }}</p>
{% endif %}
</div>
<div class="article-metadata">
<p class="article-content">{{ exercise.description }}</p>
<p class="article-content">{{ exercise.breath_method}}</p>
<p class="article-content">{{ exercise.recovery_method }}</p>
<p class="article-content">{{ exercise.measure_method }}</p>
<p class="article-content">{{ exercise.load_share }}</p>
<p class="article-content">{{ exercise.notes }}</p>
<p class="article-content">{{ exercise.extra_info }}</p>
<p class="article-content">{{ exercise.reps }}</p>
<p class="article-content">{{ exercise.sets }}</p>
</div>
<form action="{% url 'data-submit' %}" method="POST" enctype="multipart/form-data">
{% csrf_token %}
<fieldset class="form-group">
<legend class="border-bottom mb-4">Exercise Measurements</legend>
{{ form|crispy }}
</fieldset>
<div class="form-group">
<button class="btn btn-outline-info" type="submit">Save</button>
</div>
</form>
</div>
</article>
{% endfor %}
{% if is_paginated %}
{% if page_obj.has_previous %}
<a class="btn btn-outline-info mb-4" href="?page={{ page_obj.previous_page_number }}">Previous Exercise</a>
{% endif %}
{% if page_obj.has_next %}
<a class="btn btn-outline-info mb-4" href="?page={{ page_obj.next_page_number }}">Next Exercise</a>
{% else %}
<a class="btn btn-outline-info mb-4" href="{% url 'web-home' %}">Exit</a>
{% endif %}
{% endif %}
{% endblock content %}
在views.py中,我将“重定向”保留为“?”,因为我不知道在那里添加什么。
我无法更改template.html中的“操作”,因为此链接用于def add\u data(request)
因此,它将保存我的输入。
一旦我提交,它会将新数据保存到我的数据库中,但我不知道如何保持在同一页面上继续我的练习
谢谢
program/base.html
base.html
在文件底部的某个地方
$(“#提交btn”).submit(函数(事件){
//阻止默认操作,因此不刷新页面
event.preventDefault();
变量形式=$(此);
var posting=$.post(form.attr('action'),form.serialize());
过帐.完成(功能(数据){
//完成
});
过帐失败(功能(数据){
//失败
});
});
...
{%csrf_令牌%}
运动测量
{{form | crispy}}
拯救
您有一个正在练习的程序,所以使用它获取程序id查看您的数据表您有一个练习字段“如果我没有错”是外键
from django.shortcuts import redirect, reverse
def add_data(request):
page=request.GET.get('page')
page='?page={}'.format(page) if page else ''
if request.method == "POST":
form = DataForm(request.POST)
if form.is_valid():
data=form.save()
return redirect(reverse('program-detail', kwargs={'pk':data.exercise.program.pk})+ page)
若要重定向到同一页面,请在url中检查并传递页面参数,格式如下
<form action="{% url 'data-submit' %}{%if request.GET.page%}?page={{request.GET.page}}{%endif%}" method="POST" enctype="multipart/form-data">{% csrf_token %}
{%csrf\u令牌%}
是的,你说得对,我确实有外键。我现在试过了,好像他不认识-“'program-detail',pk=data.exercise.program.pk”。我在数据下面有一条红线。知道为什么吗?我认为重定向方法不能接收pk作为参数。我在文档中找不到它,但我可能错了。这是文档,您也可以使用完整的url重定向('/programs/{}/'.format(data.exercise.program.id))。我尝试了两种方法,但它无法识别“pk=data…”。知道为什么吗?谢谢,我有点迷路了。这将如何帮助我重新定向?很抱歉我的误解,我没有在这个框架中使用那么长的时间。它发送post请求而没有打开新的视图/url,所以你停留在同一个页面上。这叫做ajax。好的,这是一个很好的解决方案。我在函数的“重定向”中添加了什么?什么都没有。改用返回HttpResponse(状态=200)
。或任何其他代码,如果表单无效等。我是否需要创建程序/base.html?确切的位置在哪里?在我的模板中?我需要打电话吗?谢谢
{% block js %}{% endblock js %}
from django.shortcuts import redirect, reverse
def add_data(request):
page=request.GET.get('page')
page='?page={}'.format(page) if page else ''
if request.method == "POST":
form = DataForm(request.POST)
if form.is_valid():
data=form.save()
return redirect(reverse('program-detail', kwargs={'pk':data.exercise.program.pk})+ page)
<form action="{% url 'data-submit' %}{%if request.GET.page%}?page={{request.GET.page}}{%endif%}" method="POST" enctype="multipart/form-data">{% csrf_token %}