2009-08-19 6 views
1

J'ai un modèle de formulaire qui doit prendre les fichiers envoyés via POST et les ajouter à la base de données. Cependant, le formulaire inclut les ID des fichiers déjà dans la base de données, ce qui entraîne l'écrasement des informations. Par exemple, la sortie HTML pour la forme ressemble à ceci:Le modèle de formulaire remplace les entrées existantes au lieu d'ajouter

<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 

Cette troisième ligne - la files-0-id - est ce que je crois conduit à l'écrasement, mais je ne sais pas comment résoudre ce problème. Je souhaite que le système crée de nouveaux objets Fichier pour chaque soumission, sans utiliser les ID existants.

Mon modèle imprime les informations sous forme comme ceci:

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

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

Et les parties pertinentes du modèle, la forme, et la vue sont:

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) 

Répondre

1

The answer is in the docs:

Par défaut, lorsque vous créez un formset à partir d'un modèle, le formset utilisera un queryset qui inclut tous les objets le modèle (par exemple, Author.objects.all()). Vous pouvez modifier ce comportement en utilisant l'argument queryset

utiliser juste ObjectName.objects.none()

de comportement par défaut Odd, mais vous allez.

Questions connexes