2

我只是不知道如何在 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_uploaded_file 函数,但该页面没有解释:

  • 如何确定上传文件的保存位置?
  • 如何将文件分布在多个目录中?
  • 如何防止两个同名文件相互覆盖?
  • 我应该为模型的 ImageField 分配什么值?

好像这些问题已经被解决了一千次了……

4

2 回答 2

5

1)您ImageField需要一条upload_to路径:

models.ImageField(required=False, upload_to="/relative/path/to/foo/bar")

请注意,IIRC,这与您的 MEDIA_ROOT

2)为了将它们分布在目录中,只需设置upload_to=my_path_naming_method并执行

def my_path_naming_method(instance, filename):
  #something here that returns a new/bespoke string path for each file or similar

3) 如果两个文件具有相同的名称,Django 会给较新的文件一个_后缀。例如foo.jpg和 'foo_.jpg' 所以永远不会有名字冲突

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

于 2010-07-27T22:17:04.530 回答
-3

最后,事实证明我的代码是正确的,但我的 Django 版本是错误的。在我升级到 Django 1.2.1(从 1.0.2)后,我的代码没有改变。

回答我自己的问题

  • 相对于 settings.py 中指定的 MEDIA_ROOT,图像被上传到我指定的 upload_to 目录
  • 仍然不确定这个
  • Django 自动在文件名中添加下划线以防止重复
  • 在上面的代码中进行分配screenshot=form.cleaned_data['screenshot']按预期工作。
于 2010-08-09T09:17:41.967 回答