代码之家  ›  专栏  ›  技术社区  ›  amarillion

Django图像文件上传

  •  1
  • amarillion  · 技术社区  · 14 年前

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

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

     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 ,我必须编写自己的句柄上传文件功能,但该页面没有解释:

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

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

    2 回复  |  直到 14 年前
        1
  •  4
  •   Steve Jalim    14 年前

    1)你的 ImageField 需要一个 upload_to 路径:

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

    注意,iirc,这是相对于你的媒体根目录的

    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让你成功。

        2
  •  -2
  •   amarillion    14 年前

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

    回答我自己的问题

    • 相对于在settings.py中指定的媒体根目录,将图像上载到指定的上载目录i。
    • 还是不确定这个
    • Django自动向文件名添加下划线,以防止重复
    • 指派 screenshot=form.cleaned_data['screenshot'] 就像上面的代码一样,按预期工作。