2017-08-17 2 views
0

Hy dort, meine erste Frage auf dieser Website, so leid für mein Englisch. Also versuche ich eine Datei auf ein Modell im Django Framework hochzuladen.Django Datei hochladen mit Formular

class banner(models.Model): 
#id is made by Django 
name = models.CharField(max_length=255) 
created_by = models.CharField(max_length=255) 
company = models.CharField(max_length=255) 
register_date = models.DateField(auto_now_add=True) 
file = models.FileField(null=True, blank=True) 
file_name = models.CharField(max_length=255) 

Dies ist das Modell

class BannerForm(forms.Form): 
name=forms.CharField(max_length=255) 
created_by=forms.CharField(max_length=255) 
company=forms.CharField(max_length=255) 
data_type=forms.CharField(max_length=255) 
register_date=forms.DateField() 
file=forms.FileField() 
file_name=forms.CharField(max_length=255) 

Dies ist die Form,

def add_form (Anfrage): form = BannerForm() last = models.banner.objects.all() (.last)

if request.method == "POST": 
    form = forms.BannerForm(request.POST, request.FILES or None) 
    if form.is_valid(): 
     form.cleaned_data['created_by'] 
     new_banner=models.banner() 
     new_banner.id=last.id+1 
     new_banner.name=form.cleaned_data['name'] 
     new_banner.register_date=form.cleaned_data['register_date'] 
     new_banner.company=form.cleaned_data['company'] 
     new_banner.file=form.cleaned_data['file'] 
     new_banner.file_name=new_banner.file.name 
     new_banner.created_by=form.cleaned_data['created_by'] 
     new_banner.save() 

return render(request, "add_banner.html",{"form":form}) 

ist dies die view.Now jedes Mal, wenn ich versuche hinzufügen ein banner.Ich blättern Sie die Datei, aber nachdem ich put senden, ist es, dass die Datei ausgewählt werden muss, wie es nicht recongnize, was ich zum Formular button.Any Vorschlag?

+0

ich vergaß zu erwähnen: es sagt die vorgelegte Datei leer ist. – Unknown

+0

Haben Sie den 'enctype' in Ihrem Formular? –

+0

ich habe den enctype nur in der add_banner.html Vorlage enctype = "multipart/form-data" – Unknown

Antwort

1

gut müssen Sie den Upload-Pfad in Ihren Modellen angeben

file = models.FileField(null=True, blank=True,upload_to='files') 

und stellen Sie sicher, Sie haben MEDIA_ROOT und MEDIA_URL in Ihrem settings.py definiert

in Ihrem Formular

<form method="post" action="" enctype="multipart/form-data"> 
    {% csrf_token %} 
    ... 
</form> 
+0

STATIC_ROOT = os.path.join (os.path.dirname (BASE_DIR), "static_cdn") MEDIA_ROOT = os.path. beitreten (os.path.dirname (BASE_DIR), „media_cdn) Ich habe diejenigen, und ich ändern, aber immer noch nichts dasselbe – Unknown

+0

versuchen die bearbeiteten ans, und die Upload-Pfad nach dem Hinzufügen zu modellieren, vergessen Sie nicht, Migrationen zu machen und wandern – Exprator

+0

ich versuchte, eine leere hochladen Datei, mein dummer Fehler, aber Frage, wenn ich versuche, die gleiche Datei in eine Tabelle hochzuladen, wo ich bereits eine Zeile mit dieser Datei habe, wird es überschrieben? – Unknown

1

Sie müssen enctype="multipart/form-data" in Ihrer Formulardefinition einschließen.

<form method="post" action="your action" enctype="multipart/form-data"> 
    {% csrf_token %} 
    ... 
</form> 
+0

{% csrf_token%} {{form.as_p}}
Unknown

0

Versuchen Sie, diese so etwas wie dieses:

Models.py:

class banner(models.Model): 
#id is made by Django 
name = models.CharField(max_length=255) 
created_by = models.CharField(max_length=255) 
company = models.CharField(max_length=255) 
register_date = models.DateField(auto_now_add=True) 
file = models.FileField(upload_to='files/', null=True, blank=True) 
file_name = models.CharField(max_length=255) 

forms.py:

class BannerForm(forms.ModelForm): 
    class Meta: 
     model = banner #Or Banner ?? 
     fields = ('name', 'created_by', 'company', 'file', 'file_name') 

views.py:

from myapp.forms import BannerForm 

if request.method == "POST": 
    form = BannerForm(request.POST, request.FILES) 
    if form.is_valid(): 
     entry = form.save(commit=False) 
     entry.name = request.POST['name'] 
     entry.created_by = request.POST['created_by'] 
     entry.company = request.POST['company'] 
     entry.file_name = request.POST['file_name'] 
     form.save() 

    else: 
     form = BannerForm() 

return render(request, "add_banner.html",locals()) 

Und wie schon gesagt, nicht vergessen:

<form method="POST" action="" enctype="multipart/form-data"> 
    {% csrf_token %} 
    {{form.name}} 
    {{form.created_by}} 
    {{form.company}} 
    {{form.file_name}} 
    {{form.file}} 
    <input type="submit"> 
</form> 

Sie müssen diese Dinge nicht angeben:

new_banner.file=form.cleaned_data['file'] 

new_banner.register_date=form.cleaned_data['register_date'] -> nutzlos, weil im Modell festgelegt Sie auto_now_add = True, Sie müssen also kein Feld in Ihrem HTML-Formular erstellen.

Hinweis: Wenn Ihr Feld created_by = models.CharField(max_length=255) ist einen vorhandenen Benutzer zu setzen, so sollten Sie ein Fremdschlüsselfeld machen wie:

from django.contrib.auth.models import User 
created_by = models.ForeignKey(User, verbose_name="Created by") 
+0

k, so leid für sie alle mit meinem Mangel an Wissen stört, ist es das erste Mal, wenn ich mit django arbeiten. Jetzt speichern sie alle meine Uploads in der Hauptdatei des Projekts. Sollte ich Datei = models.FileField (null = True, leer = True, upload_to = 'files') zu file = models.FileField (null = True, leer = True, upload_to = 'files/Media') wenn ich wan der Dateien zum Ordner Media? – Unknown

+0

Sie können es versuchen. Django erstellt automatisch einen Ordner, falls dieser nicht existiert. – GrandGTO

+0

Zum Beispiel können Sie auch versuchen: upload_to = 'media/banner/was auch immer /' ') – GrandGTO