我正在尝试为特定用户上传图片,但当我选择图像并上传时没有任何反应。它不存储在数据库中,甚至不存储在媒体文件夹中
设置.py
MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')
MEDIA_URL = '/media/'
查看.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
})
模型.py
class Profile(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
profile_pic = models.ImageField(null=True, blank=True, upload_to='image/')
表单.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 %}
最佳答案
首先在您的表单中设置 model = ProfileModel
但你的型号是Profile
更正一下:
class ProfileForm(forms.ModelForm):
class Meta:
model = Profile
fields = ['profile_pic']
接下来在您的 View 中,如果发生 POST 请求,您的 View 是完全错误的。您尝试创建一个 Profile 实例并将其命名为 form 并保存它。这很可能会失败。我还假设你写 'SESSION_KEY' in request.session
尝试检查用户是否已登录,请改用 request.user.is_authenticated
或者实际上通过使用 login_required
禁止匿名用户访问您的 View 装饰师。像这样更改它:
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 个空格。检查 PEP 8 中的缩进这是 Python 代码风格指南。
关于python-3.x - 在 Django 中为特定用户上传图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66399920/