Модель Formset перезаписывает существующие записи вместо добавления - PullRequest
1 голос
/ 19 августа 2009

У меня есть Model Formset, который должен принимать файлы, отправленные через POST, и добавлять их в базу данных.

Однако форма включает в себя идентификаторы файлов, уже находящихся в базе данных, что приводит к перезаписи информации. Например, вывод HTML для формы выглядит следующим образом:

<label for="id_files-0-theFile">File:</label> 
    <input type="file" name="files-0-theFile" id="id_files-0-theFile" />
    <input type="hidden" name="files-0-id" value="1" id="id_files-0-id" />
.... and so on, for each entry form 0 .. 10

Эта третья строка - files-0-id - это то, что, как я считаю, приводит к перезаписи, но я не знаю, как это исправить. Я хочу, чтобы система создавала новые объекты File для каждой отправки, а не использовала существующие идентификаторы.

Мой шаблон печатает информацию о форме примерно так:

    <form action=... >
    {{ fileform.management_form }} 

    {% for form in fileform.forms %}
        {{ form.as_p }}
    {% endfor %}
    </form>

И соответствующие части модели, формы и вида:

class File(models.Model):
    theFile = models.FileField("File", upload_to='files/%Y/%m/%d')
    entry = models.ForeignKey(Entry)
    size = models.CharField(blank=True, max_length=100)
    name = models.CharField(blank=True, max_length=150)

class FileForm(forms.ModelForm):
    class Meta:
        model = File
        exclude = ('entry', 'size')

def add(request):

FileFormSetFactory = modelformset_factory(File, form=FileForm, extra=8,
                                    exclude=file_forms_excludes,)
file_formset = FileFormSetFactory(prefix='files')

if request.method == 'POST':

    file_formset = FileFormSetFactory(request.POST, request.FILES, 
                                      prefix='files')

    if file_formset.is_valid():

        for f in file_formset.save(commit=False):                
            f.name = f.theFile.name.split("/")[-1]
            f.size = convert_bytes(f.theFile.size)
            f.entry = entry #primary key to another object, removed for clarity



            f.save()

        ...

        return HttpResponseRedirect('/doc/' + str(entry.id)) 

else:
    context = {}
    context['fileform'] = file_formset
    context['entryform'] = entry_form
    context['entities'] = entities()
    return render_to_response('add.html', context)

1 Ответ

1 голос
/ 25 августа 2009

Ответ в документах:

По умолчанию при создании набора форм от модели, formset будет использовать набор запросов, который включает в себя все объекты в модель (например, Author.objects.all ()). Вы можете переопределить это поведение с помощью Аргумент queryset

Просто используйте ObjectName.objects.none ()

Странное поведение по умолчанию, но все готово.

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