use*_*229 3 django file-upload django-generic-views
我尝试了通用视图的简约django实现来上传个人资料图片.
views.py
class UpdateProfile(UpdateView):
form_class = UpdateUserProfileForm
model = UserProfile
success_url = reverse_lazy('show_profile')
Run Code Online (Sandbox Code Playgroud)
models.py
class UserProfile(models.Model):
user = models.OneToOneField(User)
website = models.URLField(blank=True)
picture = models.ImageField(upload_to='user/img/%Y-%m-%d/', blank=True)
Run Code Online (Sandbox Code Playgroud)
forms.py
class UpdateUserProfileForm(forms.ModelForm):
class Meta:
model = UserProfile
fields = ['website','picture']
Run Code Online (Sandbox Code Playgroud)
userprofile_form.html
<form action="" enctype="multipart/form-data" method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="{% trans "Save" %}"/>
</form>
Run Code Online (Sandbox Code Playgroud)
一切正常.现在错误消息.网站字段将正确更新,搜索按钮允许选择要上传的文件.但是,该文件永远不会出现在系统中,并且数据库字段仍为空.
不幸的是,关于文件上传的django文档(https://docs.djangoproject.com/en/1.10/topics/http/file-uploads/)不包含通用视图,所以我想知道它是否可行.
更新:感谢Alasdair的回答,我更新了我的模板,因此它现在可以正常用作带有通用视图的图片上传的简约原型.
要显示图片,文档(https://docs.djangoproject.com/en/1.10/howto/static-files/)的说明再次非常有用.
此外,媒体设置是将文件上载到媒体文件夹所必需的.
settings.py
MEDIA_URL = '/media/'
MEDIA_ROOT = 'absolute-path-to/media'
Run Code Online (Sandbox Code Playgroud)
urls.py
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Run Code Online (Sandbox Code Playgroud)
模板
{% if userprofile.picture.url|length > 0 %}
<img src="{{ userprofile.picture.url }}" width="200px">
{% else %}
<img src="{% static "/img/default_profile.jpg" %}" width="200px" />
{% endif %}
Run Code Online (Sandbox Code Playgroud)
问题出在您的模板中.你没有设置enctype,所以request.FILES总是空的.它应该是:
<form action="" enctype="multipart/form-data" method="post">{% csrf_token %}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1858 次 |
| 最近记录: |