【问题标题】:Django image file uploadsDjango 图像文件上传
【发布时间】:2011-03-21 20:27:54
【问题描述】:

我只是不知道如何在 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()

但这不起作用,文件没有上传到服务器。根据documentation on file uploads,我得自己写handle_uploaded_file函数,但是那个页面没有说明:

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

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

【问题讨论】:

    标签: django image-upload


    【解决方案1】:

    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 能让你滚动。

    【讨论】:

    • 不,这是不对的。当我在 forms.ImageField 上设置 upload_to 时,出现以下错误:“__init__() got an unexpected keyword argument 'upload_to'”
    • 哎呀-我的错字:应该是models.ImageField
    【解决方案2】:

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

    回答我自己的问题

    • 相对于 settings.py 中指定的 MEDIA_ROOT,图像被上传到我指定的 upload_to 目录
    • 还是不确定这个
    • Django 自动为文件名添加下划线以防止重复
    • 在上面的代码中分配screenshot=form.cleaned_data['screenshot'] 可以按预期工作。

    【讨论】:

    • stevejalim 回答的问题比你好。
    猜你喜欢
    • 2013-05-13
    • 2019-09-01
    • 1970-01-01
    • 2014-10-16
    • 2016-03-02
    • 2023-01-13
    • 2011-11-10
    • 2011-11-06
    • 1970-01-01
    相关资源
    最近更新 更多