【问题标题】:Cannot upload profile picture in django model无法在 django 模型中上传个人资料图片
【发布时间】:2017-07-10 06:14:18
【问题描述】:

我希望用户在个人资料页面上上传个人资料图片,但它没有将其存储在 media/documents 文件夹中,是的,我已将 enctype="multipart/form-data" 放入 html 表单和方法是post。我是 django 新手,所以请提供一个简单的解决方案

models.py

class User(models.Model):
first_name=models.CharField(max_length=20)
last_name=models.CharField(max_length=20)
username=models.CharField(max_length=25, primary_key=True)
password=models.CharField(max_length=15)
email_id=models.CharField(max_length=30, default='NULL')
profile_pic=models.ImageField(upload_to='profilepics/%Y/%m/%d/',height_field=200,width_field=200,default='')

forms.py

class ProfilePicForm(forms.ModelForm):
class Meta:
    model=User
    fields=['username','profile_pic']

views.py

def upload(request):
if request.method == 'POST':
    username=request.POST['username']
    m=User(username=username)
    m.profile_pic=request.FILES['profile_pic']
    m.save()
    return render(request,'LoginPage/done.html')
else:
    pic=ProfilePicForm()
    return render(request,'AfterLogin/profile.html')

html文件

    <form method="POST" enctype="multipart/form-data" action="{% url 'LoginPage:upload' %}">
        {% csrf_token %}
        <p>Upload your profile photo</p><br>
        <input id="id_image" type="file" class="" name="image">
        <input type="hidden" name="username" value="{{ username }}">
        <input type="submit" value="Submit"/>
    </form>

【问题讨论】:

  • 当代码中的某些内容不起作用时,最好发布错误代码。
  • 你的设置文件是怎么配置的?
  • 没有任何错误。它只是不保存照片
  • MEDIA_URL='/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
  • 即使我删除了 try 和 except 语句,也没有任何相关的错误。我得到的只是这个内部服务器错误:/favicon.ico Traceback(最近一次调用最后一次):“改为返回无。” % (callback.__module__, view_name) ValueError: 视图 LoginPage.views.upload 没有返回 HttpResponse 对象,但我认为它不相关

标签: python django django-models django-forms image-uploading


【解决方案1】:

看看这个:

Need a minimal Django file upload example

另外,请尝试分享您在尝试上传图片时遇到的错误。

【讨论】:

  • 谢谢你,但在这之后我只有一个疑问。当文件上传时,django 怎么知道这张照片是给哪个用户的?任何地方都没有提到它。它将为哪个元组保存照片?
  • 您在用户模型中有 ImageField。该字段存储图像的位置和名称,例如“/home/user/project/media/your_pic.jpg”等。并且在上传时,django 总是知道是哪个用户发送了 http 请求。
  • 当用户在登录页面通过身份验证时,他会被重定向到他必须上传个人资料图片的个人资料页面。 django 还会知道它是哪个用户吗?
  • 不。仍然不保存图像。试了代码
  • 如果用户已经通过身份验证,则每个请求和响应都包含 request.user 中的用户实例。尝试在视图中打印 request.user。此外,您正在尝试使用默认情况下存在于 django 中的用户模型以外的用户模型。另外,您的上传视图没有返回任何响应。删除 try except 循环并告诉实际错误。有多个错误。在上传视图中,您在使用之前没有定义用户名。
【解决方案2】:

我认为你最好使用 Django 创建的标准用户模型,它已经包含字段 first_name、last_name、username、password 和 email。然后,您使用模型用户创建一个具有 OneToOneField 的新模型。

如果图片上传了,如果你在运行服务器时直接访问图片url时得到404,那么你忘记了提供图片,你在生产阶段必须这样做。

urlpatterns = [
...patterns...
]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

这样的事情应该可以工作:

模块.py

from django.contrib.auth.models import User    
class UserPicture(models.Model):
        user = models.OneToOneField(User, on_delete = models.CASCADE)
        picture = models.ImageField(upload_to='...')

forms.py

class ProfilePicForm(forms.ModelForm):
      class Meta:
            model = UserPicture
            fields=['profile_pic']

views.py

def your_view(request):
    ...
    if request.method == 'POST':
        form = UserPicture(request.POST, request.FILES)

        if form.is_valid():
            userprofile = form.save()
            userprofile.user = request.user
            userprofile.save()

    ...

【讨论】:

  • 我已将此部分添加到代码中。如何使用 django 提供的 User 模型和 OnetoOne 的东西?另外,如果可能的话,请告诉我可以在我的代码中进行哪些更改以使其正常工作?
【解决方案3】:

您不必定义自己的 User 模型,因为 Django 有自己的:https://docs.djangoproject.com/en/1.10/ref/contrib/auth/#user-model

正如 Jonatan 建议的那样 - 发布错误代码。如果没有,请删除此try ... except: pass

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-07
    • 1970-01-01
    • 1970-01-01
    • 2020-01-10
    • 2014-04-14
    • 2020-04-26
    • 2018-06-06
    • 2017-09-12
    相关资源
    最近更新 更多