2017-08-17 4 views
0

Hy là, ma première question sur ce site, donc désolé pour mon anglais. J'ai donc essayé de télécharger un fichier sur un modèle dans le framework Django.Téléchargement de fichier Django en utilisant le formulaire

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) 

ce modèle est le

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) 

ceci est la forme

def add_form (demande): form = BannerForm() = dernier 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}) 

c'est le view.Now chaque fois que j'essaie d'ajouter Une bannière.Je feuillette le fichier, mais après que je presse soumettre, il est que le fichier doit être choisi, comme il ne reconnaît pas ce que je navigue sur le bouton de formulaire.Toute suggestion?

+0

J'ai oublié de mentionner: il dit que le dossier présenté est vide. – Unknown

+0

Avez-vous le jeu 'enctype' dans votre formulaire? –

+0

Je n'ai l'enctype que dans le template add_banner.html enctype = "multipart/form-data" – Unknown

Répondre

1

bien vous devez spécifier le chemin de téléchargement dans vos modèles

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

et assurez-vous que vous avez MEDIA_ROOT et MEDIA_URL défini dans votre settings.py

dans votre formulaire

<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. rejoindre (os.path.dirname (BASE_DIR), "media_cdn) J'ai ceux et je modifie mais toujours rien la même chose – Unknown

+0

essayez les édités ans, et après avoir ajouté le chemin de téléchargement au modèle, ne pas oublier de faire migrations et migrer – Exprator

+0

J'essayais de télécharger un vide fichier, mon erreur stupide, mais question, quand je tente de télécharger le même fichier sur une table où j'ai déjà une ligne avec ce fichier il sera écrasé? – Unknown

1

Vous devez inclure enctype="multipart/form-data" dans votre définition de formulaire.

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

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

0

Essayez ceci quelque chose comme ceci:

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

Et comme déjà dit, ne pas oublier:

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

Vous ne devez pas spécifier ces choses:

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

new_banner.register_date=form.cleaned_data['register_date'] -> inutile parce que dans votre modèle que vous définissez auto_now_add = True, Vous n'avez donc pas besoin de créer un champ dans votre formulaire HTML.

Note: si votre champ created_by = models.CharField(max_length=255) est de mettre un utilisateur existant, vous devez donc faire un champ de clé étrangère comme:

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

k, donc désolé de vous déranger tous avec mon manque de connaissances, c'est la première fois que je travaille avec django. Alors maintenant, ils stockent tous mes téléchargements dans le fichier principal du projet. Devrais-je changer file = models.FileField (null = True, vide = True, upload_to = 'fichiers') en fichier = models.FileField (null = Vrai, vide = True, upload_to = 'fichiers/Media') si je veux les fichiers à placer dans le dossier appelé Media? – Unknown

+0

Vous pouvez essayer. Django créera automatiquement un dossier s'il n'existe pas. – GrandGTO

+0

Par exemple, vous pouvez aussi essayer: upload_to = 'media/banner/whatever /' ') – GrandGTO