2016-05-21 12 views
1

Ich erstelle eine App, mit der Benutzer Dateien in einen AWS S3-Bucket hochladen können. Jeder Benutzer erhält bei der Anmeldung einen Ordner im Ordner media, basierend auf dessen userID Wie erlaube ich meinen Benutzern, ihre Projekte in ihre Ordner hochzuladen? Die Dateien werden nur gut hochgeladen, aber in einen Ordner mit dem Namen None. Das scheint eine einfache Antwort zu sein, aber ich kann es nicht finden. Hier ist meine views.pyIn benutzerdefinierte Ordner hochladen Django

def new(request): 
    title = "Add New Project" 
    if not request.user.is_authenticated(): 
     raise Http404 
    form = ProjectForm(request.POST or None, request.FILES or None) 
    if form.is_valid(): 
     instance = form.save(commit=False) 
     instance.fileLocation = request.user.id 
     instance.user = request.user 
     instance.save() 
     return redirect("/dashboard/") 
    context = { 
     "form": form, 
     "title": title, 
    } 

Hier ist mein models.py

from django.db import models 
from django.conf import settings 

# Create your models here. 
class Project(models.Model): 
    fileLocation = None 
    user = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True) 
    title = models.CharField(max_length=200) 
    description = models.TextField() 
    sell = models.BooleanField(default=False) 
    timestamp = models.DateTimeField(auto_now_add=True) 
    image = models.FileField(upload_to=fileLocation, null=True, blank=True) 
    def __str__(self): 
     return self.title 

Und hier ist mein forms.py (für alle Fälle)

from django import forms 
from .models import Project 
from django.contrib.auth.models import User 

class ProjectForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(ProjectForm, self).__init__(*args, **kwargs) 
     self.fields['image'].required = True 

    class Meta: 
     model = Project 
     fields = [ 
      'title', 
      'description', 
      'image', 
      'sell', 
     ] 

Antwort

0

die Anfrage param auf Ihre Modelform schicken init .. und verwenden Sie (vorausgesetzt, Sie haben dann Zugriff auf request.user), um das für diesen Benutzer spezifische Standortfeld festzulegen

+0

Könnten Sie bitte etwas genauer sein – pepper5319

+0

leid, dass ich nicht so detailliert war, aber diese Frage wurde bereits auf verschiedene Weise beantwortet worden. Können Sie diesen Link für ein doppeltes Problem überprüfen: [link] (http://stackoverflow.com/questions/5135556/dynamic-file-path-in-django). Vielleicht möchten Sie auch ImageField direkt anstelle von FileField verwenden, um die Bilddimensionen, Dateitypenüberprüfungen usw. besser zu handhaben. –

+0

Okay cool. Vielen Dank – pepper5319

0

Das Problem ist in Ihrem models.py.

hinzufügen:

def fileLocation(instance, filename): 
    return 'uploads/{0}/{1}'.format(instance.owner.username, os.path.basename(filename)) 

entfernen diese:

fileLocation = None 

und Datei Ihrer Benutzers in uploads/<username>/<filename> gehen sollte.

Wie BobbyC erwähnt, sollten Sie Imagefield anstelle von Filefield