无法在django模型中上传个人资料图片

时间:2017-02-20 20:17:35

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

我希望用户在个人资料页面上上传个人资料图片,但不会将其存储在媒体/文档文件夹中,是的,我已经在html表单中输入了enctype =“multipart / form-data”方法是邮寄。我是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>

3 个答案:

答案 0 :(得分:1)

看看这个:

Need a minimal Django file upload example

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

如果图片上传,如果在运行服务器时直接转到图片网址时获得404,则您忘记提供图片,而在生产阶段您必须这样做。

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

这样的事情应该有效:

modles.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()

    ...