Django - 为不同的用户提供不同的MEDIA_ROOT

时间:2014-02-18 02:38:27

标签: django django-forms image-uploading django-models

我正在使用Django 1.5,我希望用户能够上传照片。我希望照片存储在不同的位置,具体取决于用户ID。因此,例如,如果用户上传文件并且用户ID为1(当从Django通用用户模型创建用户对象时为每个用户提供ID /唯一主键),那么我希望将图像保存在目录

myPorjectFolder/myApp/static/site_media/images/1(the users ID)/uploadedPhotos

这就是我认为我应该这样做的方式。在settings.py中,添加以下行:

MEDIA_ROOT = '/home/userName/myProject/myApp/site_media/static/images/'

然后在models.py中创建如下模型:

from django.db import models
from django.contrib.auth.models import User

class UserImages(models.Model):
    user = models.OneToManyField(User)
    photo = models.ImageField(upload_to=currentUsersID/uploadedPhotos) #I know this won't work.. how would I make it work?

我是对的吗?或者它的完成方式与我的想法完全不同?

编辑:我的forms.py是这样的:

class UploadImageForm(forms.Form):
    image = forms.ImageField()

1 个答案:

答案 0 :(得分:1)

如果您想使用用户的ID,您可以创建一个上传图像的功能,如下所示:

def get_file_path(instance, filename):
  return os.path.join('%s/uploadedPhotos' % instance.user_id, filename)

然后在你的模型的ImageField中你会做

class UserImages(models.Model):
  user = models.ForeignKeyField(User)
  photo = models.ImageField(upload_to=get_file_path)

另请注意,我使用ForeignKeyField作为用户属性。没有OneToManyField,只有ForeignKey,OneToOne和ManyToMany。

编辑:

对于您的表单用法,您可以执行以下操作:

form = UploadImageForm(request.POST)
form.instance.user = request.user
user_image = form.save()

但您需要将forms.py修改为以下内容:

class UploadImageForm(forms.ModelForm):
  class Meta:
    model = UserImages
    fields = ['photo']