Python 3.x 在Django中为特定用户上载图像
我试图上传图片的具体用户,但没有发生什么事,当我选择图像和上传它。它不存储在数据库中,甚至不存储在媒体文件夹中 setting.pyPython 3.x 在Django中为特定用户上载图像,python-3.x,django,postgresql,Python 3.x,Django,Postgresql,我试图上传图片的具体用户,但没有发生什么事,当我选择图像和上传它。它不存储在数据库中,甚至不存储在媒体文件夹中 setting.py MEDIA_ROOT = os.path.join(BASE_DIR, 'media/') MEDIA_URL = '/media/' View.py def uploadPic(request): if request.method == 'POST' and 'SESSION_KEY' in request.session: form
MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')
MEDIA_URL = '/media/'
View.py
def uploadPic(request):
if request.method == 'POST' and 'SESSION_KEY' in request.session:
form = Profile(
user_id=request.session['SESSION_KEY'],
profile_pic=ProfileForm(request.POST, request.FILES)
)
form.save()
return redirect('home')
else:
form = ProfileForm()
return render(request, 'upload.html', {
'form': form
})
Model.py
class Profile(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
profile_pic = models.ImageField(null=True, blank=True, upload_to='image/')
Form.py
class ProfileForm(forms.ModelForm):
class Meta:
model = ProfileModel
fields = ['profile_pic']
模板
{% extends 'home.html'%}
{% block content %}
{%if user.is_authenticated%}
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Upload</button>
</form>
{% endif %}
{% endblock %}
{%extends'home.html%}
{%block content%}
{%if user.u是否经过身份验证%}
{%csrf_令牌%}
{{form.as_p}}
上传
{%endif%}
{%endblock%}
首先在表单中设置model=ProfileModel
,但您的模型是Profile
请更正:
class ProfileForm(forms.ModelForm):
class Meta:
model = Profile
fields = ['profile_pic']
接下来,在你的观点中,如果有POST请求,你的观点是完全错误的。您尝试创建一个Profile实例,将其称为form并保存。这可能会失败。此外,我假设您在request.SESSION中编写了'SESSION\u KEY',试图检查用户是否登录,而使用
?您还将媒体URL添加到urlpatterns了吗?是的,我添加了URL:urlpatterns=[path('upload',views.uploadPic,name='upload'),]if settings.DEBUG:URLPerns+=static(settings.media\u URL,document\u root=settings.media\u root)非常感谢您的帮助,现在我的图片已显示在媒体文件夹和数据库中:)从Condition中删除session_key line后最后一件事我如何显示我的图片如果您想为一个用户保存多个图像,您当前的实现很好。否则,如果只想存储一个字段,则应该使用一对一字段而不是外键。如果要显示第一个图像,请使用当前实现:或实际上不允许匿名用户使用request.user.is\u authenticated
装饰程序访问您的视图。这样改变它:login\u required
from django.contrib.auth.decorators import login_required @login_required def uploadPic(request): if request.method == 'POST': form = ProfileForm(request.POST, request.FILES) if form.is_valid(): form.instance.user = request.user form.save() return redirect('home') else: form = ProfileForm() return render(request, 'upload.html', {'form': form})
注意:我答案的缩进是4个空格,与你的缩进不同。为了便于阅读,最好缩进4个空格。检查缩进,缩进是Python代码的样式指南。@usmanimtiaz在请求中的“会话密钥”中使用该缩进做什么。会话{%with profile=request.user.profile_set.first%}{%endwith%}