Данные набора форм Django всегда сохраняются - PullRequest
3 голосов
/ 01 ноября 2011

Мне кажется, что я упускаю что-то очевидное, но у меня проблема с тем, что мои модельные наборы настаивают на сохранении своих данных после отправки. Я создаю страницу, которая позволяет пользователю создать проект, а затем добавить произвольное количество материалов в этот проект. 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 %}

Ответы [ 2 ]

3 голосов
/ 01 ноября 2011

Я думаю, вам нужно использовать пользовательский набор запросов , чтобы ваш набор форм создавался с пустым набором запросов. Вам необходимо указать набор запросов в ветвях POST и GET вашего оператора if.

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())

В данный момент ваш набор форм использует набор запросов по умолчанию, который содержит все объекты в модели.

0 голосов
/ 06 апреля 2015

Ответ на вопрос the old data is always persists in modelformset здесь. https://docs.djangoproject.com/en/1.8/topics/forms/modelforms/#changing-the-queryset, как указано в документе, изменить набор запросов, переопределив конструктор базового набора моделей

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()

Та же проблема обсуждалась здесь
django modelformset_factory поддерживает ранее представленные данные даже после успешного создания объектов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...