自动重新加载页面而无需再次输入URL Django

4
我的网页由两个部分组成,上面的部分是一个让用户输入数据的区域,而下面的部分以表格形式显示数据库中的所有数据。当用户在上面的部分选择“添加”按钮时,数据将被保存到数据库中并在网页底部的表格中输出。有没有办法在我选择“添加”按钮时显示表格呢?目前代码的做法是当“添加”按钮被选中时,它会加载一个新的表单,但整个表格都会消失。我必须手动再次输入这个地址“http://127.0.0.1:8000/hrfinance/lscholarship/”,然后才能看到表格。即使刷新页面也不行。以下是我的代码:

views.py:

def scholarship(request, id=None):
    query_results = []
    if request.method == "POST":
        form = ScholarshipForm(request.POST)
        if form.is_valid():
            scholarship = form.save(commit=False)
            scholarship.save()
    else:
        form = ScholarshipForm()
        id = request.GET.get('scholarship')
    query_results = Scholarship.objects.all()
    data = {
            'query_results':query_results,
            'form': form
           }
    return render(request, 'hrfinance/add_remove_scholarship.html', data)

models.py

class Application(models.Model):
    studentID = models.CharField("Student ID", max_length=8, validators=[MinLengthValidator(8)], primary_key=True, default="")
    studentName = models.CharField("Student Name", max_length=500, default="")
    scholarship = models.TextField("Scholarship")

add_remove_scholarship.html

<div align="center" >
<form method="POST" onsubmit="return validation()" action="">
{% csrf_token %}
{{ form.errors }}
    <p>Upload File: {{ form.doc }}</p>
    <p>Faculty: {{ form.faculty }} </p>
    <p>Opening date: <input id="odate" type="date" name="openDate"> </p>
    <p>Closing date: {{ form.closeDate }} </p>
    <input type="submit" name="AddScholarship" value="Add Scholarship"   >
</form>
</div>
<br></br>
    <button id="button" type="button">Delete Selected Scholarship</button>
    <br></br>
    {{query_results}}
    <form method="POST" action="">
    {% csrf_token %}
<table  id="example" class="display" cellspacing="0" width="100%" border="1.5px">
    <tr align="center">
        <th> Scholarship </th>
        <th> Faculty </th>
        <th> Open Date </th>
        <th> Close Date </th>
    </tr>
    {% for item in query_results %}
    <tr align="center">
        <td>{{item.doc}}</td>
        <td>{{item.faculty}}</td>
        <td>{{item.openDate}}</td>
        <td>{{item.closeDate}}</td>
    </tr>
    {% endfor %}
    </table>
    </form>
2个回答

5
最佳实践是使用Post/Redirect/Get模式。这样做也可以解决您的问题:GET请求将清除表单并显示新的查询结果。
如果表单成功保存,只需返回当前页面的重定向即可。然后,浏览器会执行GET请求。这可以防止意外重复提交表单,例如,当用户在仍然是POST请求时重新加载当前页面时。
from django.shortcuts import redirect

def scholarship(request, id=None):
    query_results = []
    if request.method == "POST":
        form = ScholarshipForm(request.POST)
        if form.is_valid():
            scholarship = form.save(commit=False)
            scholarship.save()
            # Return a redirect to the same page
            return redirect('/path/to/current/page/')
    ...

如果我的urls.py文件是:url(r'^lscholarship/$', views.scholarship, name='lscholarship'),那么'/path/to/current/page/'就是'lscholarship'。 - user5466566
我尝试了'lscholarship',但是出现了错误提示:"NoReverseMatch at /hrfinance/lscholarship/ Reverse for 'lscholarship' not found. 'lscholarship' is not a valid view function or pattern name." 由于我对Django还很陌生,正在学习中,请帮忙解决。 - user5466566
使用 redirect() 函数时,可以使用 URL 路径(例如 /hrfinance/lscholarship/)或 URL 的名称,Django 会自动反转。你是否在使用 URL 命名空间(例如在 urlconf 中设置了 app_name 属性)?如果没有,那么 redirect('lscholarship') 应该也能正常工作。 - knbk

2
def scholarship(request, id=None):
    query_results = []
    if request.method == "POST":
        form = ScholarshipForm(request.POST)
        if form.is_valid():
            scholarship = form.save(commit=False)
            scholarship.save()

    else:
        id = request.GET.get('scholarship')
    query_results = Scholarship.objects.all()
    form = ScholarshipForm()
    data = {
            'query_results':query_results,
            'form': form
           }
    return render(request, 'hrfinance/add_remove_scholarship.html', data)

您需要将查询移出else条件。

尽管如此,随着数据库中行数的增加,该方法需要花费大量时间。更好的方法是使用jQuery Ajax方法更新数据库中的数据,并在数据库更新后使用JavaScript/JQuery动态显示数据。


你介意为我写一部分代码,以便我可以使用jQuery Ajax开始学习Django吗?我是新手,想要学习所有类型的相同功能的方式,以提高效率。 - user5466566
是的,它有效。非常感谢 :) 但是表单将包含我之前输入的内容。有没有办法使所有字段都为空? - user5466566
我需要查看您的模型和模板。 - badiya
我已经编辑了我的问题,包括模型和模板。 - user5466566
在这个句子中,“表格将包含我输入的上一个表格。有没有办法使所有字段都为空?”我的意思是,在我选择“添加”按钮之后,字段仍然包含我输入的值。在正常情况下,一旦提交表单,当提交完成时,字段将变为默认或空白。希望这个解释让你清楚我想问什么。 - user5466566
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接