Django图像文件上载

Django图像文件上载,django,image-upload,Django,Image Upload,我就是不知道如何用django上传图片。我在这里读了几十篇博客文章和问题,但其中大多数让我更加困惑 这是我到目前为止所拥有的。这是我的模型: class Post(models.Model): user = models.ForeignKey(User) screenshot = models.ImageField(null=True, upload_to="images") date = models.DateTimeField("date posted", auto_now=T

我就是不知道如何用django上传图片。我在这里读了几十篇博客文章和问题,但其中大多数让我更加困惑

这是我到目前为止所拥有的。这是我的模型:

 class Post(models.Model):
  user = models.ForeignKey(User)
  screenshot = models.ImageField(null=True, upload_to="images")
  date = models.DateTimeField("date posted", auto_now=True)
  text = models.TextField()
以下是我使用的表格:

 class PostForm(forms.Form):
   text = forms.CharField(
      widget = forms.Textarea(attrs = {'cols': 40, 'rows': 10}), required=True)
   screenshot = forms.ImageField(required=False)
以下是我目前处理表单的方式:

  if request.method == 'POST':
    form = PostForm(request.POST, request.FILES)
    if form.is_valid():
      post = Post(
        user = request.user, 
    text=form.cleaned_data['text'], 
    screenshot=form.cleaned_data['screenshot']
      )
      post.save()
但这不起作用,文件没有上传到服务器。根据,我必须编写自己的handle\u upload\u file函数,但该页面没有解释:

  • 如何确定上传文件的保存位置
  • 如何将文件分散到多个目录中
  • 如何防止两个同名文件相互覆盖
  • 我应该为模型的ImageField指定什么值
这些问题似乎已经解决了一千次了……

1)您的
ImageField
需要一个
上传路径:

models.ImageField(必需=False,上传到=“/relative/path/to/foo/bar”)

请注意,IIRC,这是相对于您的媒体根

2) 要将它们分散到目录中,只需设置
upload\u to=my\u path\u naming\u method
并执行以下操作

def my_path_naming_method(instance, filename):
  #something here that returns a new/bespoke string path for each file or similar
3) 如果两个文件具有相同的名称,Django将为较新的文件提供一个
\uu
后缀。例如
foo.jpg和'foo_uo.jpg',这样就不会有名称冲突


4) 我不明白你的意思,但希望1-3能让你成功。

最后,我的代码是对的,但我的Django版本是错的。在我升级到Django 1.2.1(从1.0.2)之后,我的代码没有改变

回答我自己的问题

  • 相对于settings.py中指定的媒体根目录,图像将上载到指定的上载目录I
  • 还是不确定这件事
  • Django会自动在文件名中添加下划线,以防止重复
  • 分配
    screenshot=form.cleaned_数据['screenshot']
    就像上面代码中的那样,工作正常

  • 不,那是不对的。当我在forms.ImageField上将upload_设置为时,我得到以下错误:“\uuu init_uuuuuu()得到了一个意外的关键字参数‘upload_to’”哇-我的输入错误:应该是models.ImageFieldstevejalim比你回答得更好。