2017-06-03 5 views
1

Ich habe ein Django-Modell einer Herberge mit einem der Felder FileUpload, von denen ich eine CSV-Datei nehmen und die Datenbank füllen werde, habe ich seit zwei Tagen versucht zu suchen, wie tue das, aber konnte das nicht funktionieren Diese how to import csv data into django models Frage funktioniert aber nur, wenn ich den Pfad für die Datei habe, und ich versuchte viele Möglichkeiten, aber waren nicht erfolgreich. Auch danach habe ich versucht, die Suche schwieriger How do I get a files absolute path after being uploaded in Django? sah ich dies aber selbst dann konnte ich nicht bekommen es funktioniert, wie es einige Fehler zeigtSpeichern von Daten aus einer CSV-Datei in eine Datenbank

ich verwendet, um dieses URL-Zuordnung url(r'^test/$',views.FileUpload.as_view(),name="test")

Aber es ist etwas Namespace Fehler zeigt. Bitte sag mir, wie ich es machen soll, wenn du ein paar Vorschläge hast, wie ich wieder anfangen soll, fühle ich mich wirklich verloren. Ich möchte eine Datei von einem Benutzer erhalten und dann die Datenbank füllen

Kann diese (How do I transfer data in .csv file into my sqlite database in django?) wie gemacht werden wir ein Formular mit einem Filefield schaffen könnte, die durch Parsen von CSV und dann bevölkern die Datenbank akzeptiert, dass Problem, dass können wir den Pfad nicht fest codieren? Wie sollen wir das machen?

EDIT views.py

from django.views import View 
class FileUpload(View): 
    def post(self, request): 
     form = DocumentForm(request.POST, request.FILES) 
     if form.is_valid(): 
      initial_obj = form.save(commit=False) 
      data=initial_obj['document'] 
      with open((data),'rb') as csvfile: 
       spamreader = csv.reader(csvfile) 
       for row in spamreader: 
        _, created=Document.objects.get_or_create(
        name=row[0], 
        description = row[1], 
        importance=row[2], 
        ) 

      initial_obj.save() 
      form.save() 
      return redirect('/') 
     else: 
      return render(request,'file_upload_form.html',{'form':form}) 

    def get(self, request): 
     return render(request, 'file_upload_form.html', {'form': form,}) 

forms.py

class DocumentForm(forms.ModelForm): 
    class Meta: 
     model = Document 
     fields = ('description', 'document',) 

models.py

class Document(models.Model): 
    name=models.CharField(max_length=50,blank=True) 
    description=models.CharField(max_length=255, blank=True) 
    importance=models.CharField(max_length=10, default="High") 
    document = models.FileField(upload_to='documents/') 
    uploaded_at = models.DateTimeField(auto_now_add=True) 

    def __str__(self): 
     return self.description 

Ich erhalte keine Fehler, aber es speichert keine Daten in der Datenbank aus der CSV-Datei und leitet mich auf dieselbe Seite um, wo das Hochladen durchgeführt werden muss, und zeigt den Fehler "Dieses Feld ist erforderlich" für das Dokumentfeld an.

Updates: Ich löste das Problem mehr Details here

Antwort

0

Sie können die clean() Methode des Formulars leicht außer Kraft setzen, und Ihren benutzerdefinierten Dateninhalt in der Datenbank speichern

def clean(self): 
    super(DocumentForm, self).clean() 
    import csv 
    with open((self.cleaned_data['file']), 'rb') as csvfile: 
    spamreader = csv.reader(csvfile) 
    for row in spamreader: 
     // DO WHATEVER YOU WANT 
+0

ich einen Neuling bin, aufwendige wie bitte. – 4rshdeep

+0

fügen Sie diesen Code in Ihre 'DocumentForm' hinzu, dann durchlaufen Sie Ihre Datei und speichern Sie sie in der Datenbank –

+0

@unpaired_Electron sah Ihre Frage auf der anderen [Post] (https://Stackoverflow.com/a/44343404/1526703) und folgte zurück um zu überprüfen, ob Sie noch Hilfe benötigen. In der Antwort von Moe Far ist _file_ der Name des Feldes, das den Pfad der csv-Datei akzeptiert (Sie müssen es also nicht hart codieren). Sobald Sie den obigen Code hinzufügen, wie Moe vorgeschlagen hat, kann der Benutzer einfach den Pfad auf dem Front-End eingeben und Sie können die CSV in die Datenbank füttern (wie Sie die db von der CSV befüllen, geht in 'tun was immer Sie wollen' Teil im obigen Code). Post zurück, wenn Sie mehr Klärung benötigen – Anupam

Verwandte Themen