【问题标题】:Upload image in Django for specific user在 Django 中为特定用户上传图像
【发布时间】:2021-02-27 14:40:47
【问题描述】:

我正在尝试为特定用户上传图片,但当我选择图片并上传时没有任何反应。它不存储在数据库中,甚至不存储在媒体文件夹中

setting.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/')

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 %}

【问题讨论】:

    标签: python-3.x django postgresql


    【解决方案1】:

    首先在您的表单中设置model = ProfileModel,但您的模型是Profile,正确的是:

    class ProfileForm(forms.ModelForm):
        class Meta:
            model = Profile
            fields = ['profile_pic']
    

    在您的视图中,如果是 POST 请求,您的视图是完全错误的。您尝试创建 Profile 的实例并将其命名为 form 并保存。这很可能会失败。另外我假设您编写'SESSION_KEY' in request.session 是为了检查用户是否已登录,而不是使用request.user.is_authenticated,或者实际上使用login_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 个空格。检查PEP 8 中的缩进,这是 Python 代码的样式指南。

    【讨论】:

    • @usmanimtiaz 你用这个做什么'SESSION_KEY' in request.session?您是否也将媒体网址添加到 urlpatterns 中?
    • 是的,我添加了 url:urlpatterns = [ path('upload', views.uploadPic, name='upload'),] if settings.DEBUG: urlpatterns += static(settings.MEDIA_URL, document_root= settings.MEDIA_ROOT)
    • 非常感谢您的帮助,现在我的图片已显示在媒体文件夹和数据库中 :) 从条件中删除 session_key 行后
    • 最后一件事如何显示我的照片
    • 如果您想为一个用户保存多个图像,您当前的实现就可以了。否则,如果你只想存储一个,你应该有一个一对一的字段而不是一个外键。无论如何,如果您想显示第一张图片,请使用您当前的实现:{% with profile=request.user.profile_set.first %}&lt;img src="{{ profile.profile_pic.url }}"&gt;{% endwith %}
    猜你喜欢
    • 2019-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 1970-01-01
    • 1970-01-01
    • 2019-03-24
    • 2018-11-27
    相关资源
    最近更新 更多