我无法弄清楚如何在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()
但是这不起作用,文件没有上传到服务器。根据{{3}},我必须编写自己的handle_uploaded_file函数,但该页面没有解释:
这些问题似乎已经解决了一千次......
答案 0 :(得分:4)
1)您的ImageField
需要upload_to
路径:
forms.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让你滚动。
答案 1 :(得分:-2)
最后,事实证明我的代码是正确的,但我的Django版本错了。在我升级到Django 1.2.1(从1.0.2开始)之后,我的代码没有改变。
回答我自己的问题
screenshot=form.cleaned_data['screenshot']
就像预期的那样工作。