Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django模型表单集数据始终保持不变_Django - Fatal编程技术网

Django模型表单集数据始终保持不变

Django模型表单集数据始终保持不变,django,Django,我觉得我肯定错过了一些明显的东西,但我遇到了一个问题,我的模型表单集坚持在提交后保留它们的数据。我正在创建一个页面,允许用户创建一个项目,然后向该项目添加任意数量的材料。JavaScript负责根据需要动态添加表单集的新实例。代码在第一次运行时工作良好,之后它“记住”以前的数据。它适用于材质模板集,但不适用于其上方的常规模型模板 我想这一定与我创建模型表单集的方式有关。当请求页面时,视图似乎在传回绑定到旧数据的表单集,而不是未绑定的表单集。我是Django的新手,正在努力自学,所以工作中可能有些

我觉得我肯定错过了一些明显的东西,但我遇到了一个问题,我的模型表单集坚持在提交后保留它们的数据。我正在创建一个页面,允许用户创建一个项目,然后向该项目添加任意数量的材料。JavaScript负责根据需要动态添加表单集的新实例。代码在第一次运行时工作良好,之后它“记住”以前的数据。它适用于材质模板集,但不适用于其上方的常规模型模板

我想这一定与我创建模型表单集的方式有关。当请求页面时,视图似乎在传回绑定到旧数据的表单集,而不是未绑定的表单集。我是Django的新手,正在努力自学,所以工作中可能有些事情我还没有完全掌握。以下是视图的代码:

def addproject_page(request):

# Define the formset to use to add the materials
MaterialFormSet = modelformset_factory(Material, exclude = ('project',))

# Check to see if there is some POST data from an attempt to fill out the form
if request.method == 'POST':

    # Create a form for the project and for the material and use a prefix to separate the POST data for the two
    project_form = ProjectForm(request.POST, prefix='project')
    # Instantiate the formset to display multiple materials when creating a project
    material_formset = MaterialFormSet(request.POST, prefix='material')

    # Check both forms with the validators and if both are good process the data
    if project_form.is_valid() and material_formset.is_valid():
        # Save the data for the newly created project
        created_project = project_form.save()
        # Tell each material to be associated with the above created project
        instances = material_formset.save(commit=False)
        for instance in instances:
            instance.project = created_project
            instance.save()

        # After the new project and its materials are created, go back to the main project page
        return HttpResponseRedirect('/members/projects/')

# If there is no post data, create and show the blank forms
else:
    project_form = ProjectForm(prefix='project')
    material_formset = MaterialFormSet(prefix='material')
return render(request, 'goaltracker/addproject.html', {
    'project_form': project_form,
    'material_formset': material_formset,
})
编辑以添加我的模板代码,以防有帮助:

{% extends "base.html" %}

{% block external %}
<script src="{{ static_path }}js/projects.js" type="text/javascript"></script>
{% endblock %}

{% block title %}: Add Project{% endblock %}

{% block content %}

<h1>Add a Project</h1> 

<form id="new_project_form" method="post" action="">
{{ project_form.as_p }}

<!--  The management form must be rendered first when iterating manually -->
<div>{{ material_formset.management_form }}</div>
<!--  Show the initial blank form(s) before offering the option to add more via JavaScript -->
{% for material_form in material_formset.forms %}
    <div>{{ material_form.as_p }}</div>
{% endfor %}

<input type="button" value="Add Material" id="add_material">
<input type="button" value="Remove Material" id="remove_material">
<input type="submit" value="add" />
</form>

{% endblock %}
{%extends“base.html”%}
{%block external%}
{%endblock%}
{%block title%}:添加项目{%endblock%}
{%block content%}
添加项目
{{project_form.as_p}
{{material\u formset.management\u form}
{material_formset.forms%}
{{material_form.as_p}}
{%endfor%}
{%endblock%}
我认为您需要这样做,以便用空查询集实例化您的表单集。您需要在
if
语句的
POST
GET
分支中指定查询集

if request.method == "POST":
    ...
    material_formset = MaterialFormSet(request.POST, prefix='material', queryset=Material.objects.none())
    ...
else:
    material_formset = MaterialFormSet(prefix='material', queryset=Material.objects.none())

目前,您的表单集正在使用默认的queryset,它包含模型中的所有对象。

问题的答案
旧数据始终存在于模型中formset
在这里。正如文档中给出的那样,通过重写basemodelformset的构造函数来转换查询集

from django.forms.models import BaseModelFormSet

from myapp.models import Author

class CalendarFormset(BaseModelFormSet):
    def __init__(self, *args, **kwargs):
        super(CalendarFormset, self).__init__(*args, **kwargs)
        self.queryset = Calendar.objects.none()
这里讨论了同样的问题

代码看起来不错。当你看到这个问题时,你在做什么?你是如何重新显示页面的?可能是你的浏览器缓存了数据吗?我想可能是浏览器缓存。我清除了缓存等等,并试图从一个完全不同的浏览器访问页面,但数据甚至出现在另一个浏览器中。它甚至在停止和启动开发服务器后仍然存在。我能让它“重置”的唯一方法是删除会话和相关表,然后重新运行syncdb