Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django映像未保存在数据库中_Python_Html_Django_Django Models_Django Database - Fatal编程技术网

Python Django映像未保存在数据库中

Python Django映像未保存在数据库中,python,html,django,django-models,django-database,Python,Html,Django,Django Models,Django Database,我正试图上传一张用户照片并在主页上显示 问题1:当我从管理部分上传一张图片时,它会保存在数据库中,但不会显示在“homepage.html”中 问题2:当我尝试使用“profile.html”模板上传图像时,图像甚至没有保存在数据库中 我尝试了stackoverflow的几种解决方案,但都没有解决我的问题。我的代码如下: models.py from django.db import models from django.contrib.auth.models import User from

我正试图上传一张用户照片并在主页上显示

问题1:当我从管理部分上传一张图片时,它会保存在数据库中,但不会显示在“homepage.html”中

问题2:当我尝试使用“profile.html”模板上传图像时,图像甚至没有保存在数据库中

我尝试了stackoverflow的几种解决方案,但都没有解决我的问题。我的代码如下:

models.py

from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver


class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile')
    first_name= models.CharField(max_length=100, default='', blank=True)
    last_name = models.CharField(max_length=100, default='', blank=True)
    email = models.CharField(max_length=100, default='', blank=True)
    pro_pic = models.ImageField(upload_to='profilepic',blank=True)
    phone = models.CharField(max_length=20, blank=True, default='')
    city = models.CharField(max_length=100, default='', blank=True)
    country = models.CharField(max_length=100, default='', blank=True)
    job = models.CharField(max_length=20, blank=True, default='')
    organization = models.CharField(max_length=100, default='', blank=True)

    def __str__(self):
        return self.user.username

    @receiver(post_save, sender=User)
    def create_user_profile(sender, instance, created, **kwargs):
        if created:
            UserProfile.objects.create(user=instance)

    @receiver(post_save, sender=User)
    def save_user_profile(sender, instance, **kwargs):
        instance.profile.save()
forms.py

from django.contrib.auth.models import User
from django import forms
from .models import UserProfile


class UserForm(forms.ModelForm):
    class Meta:
        model = UserProfile
        fields = ['first_name', 'last_name', 'email']

class ProfileForm(forms.ModelForm):
    class Meta:
        model = UserProfile
        fields = ['pro_pic','phone', 'city', 'country', 'job', 'organization']
设置.py

MEDIA_URL = '/media/'
MEDIA_ROOT=os.path.join(BASE_DIR,'obs/media')
views.py

@login_required
@transaction.atomic
def update_profile(request):
    if request.method == 'POST':
        user_form = UserForm(request.POST, instance=request.user)
        profile_form = ProfileForm(request.POST, instance=request.user.profile)
        if user_form.is_valid() and profile_form.is_valid():
            user_form.save()
            profile_form.save()
            messages.success(request,'Your profile was successfully updated!')
            return redirect('obs:homepage')
        else:
            messages.error(request, 'Please correct the error below.')
    else:
        user_form = UserForm(instance=request.user)
        profile_form = ProfileForm(instance=request.user.profile)
    return render(request, 'obs/profile.html', {
        'user_form': user_form,
        'profile_form': profile_form
    })
profile.html

{% extends 'obs/base.html' %}


{% block body %}
{% load staticfiles %}
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
    <link href='https://fonts.googleapis.com/css?family=Satisfy' rel='stylesheet' type='text/css'>
    <link rel="stylesheet" type="text/css" href="{% static 'obs/profilecss.css' %}"/>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>



<head>
    <title>Profile</title>
</head>

<div class="container">
    <div class="row">
        <div class="col-md-5 col-md-offset-3">
            <div class="panel panel-default">
                <div class="panel-heading">
                    <span class="glyzphicon glyphicon-user"></span> Update User Profile</div>

                <div class="panel-body">
                    {% if error_message %}
                        <p><strong>{{ error_message }}</strong></p>
                    {% endif %}
                 <form method="post" class="hello">
                  {% csrf_token %}

                 {% for field in user_form %}

                    <div class="form-group">
                        <label  class="col-sm-15 control-label">
                            {{ field.label_tag }}</label>
                        {{ field }}

                    </div>

                {% endfor %}

                {% for field in profile_form %}

                    <div class="form-group">
                        <label  class="col-sm-15 control-label">
                            {{ field.label_tag }}</label>
                        {{ field }}

                    </div>

                {% endfor %}
                  <center>
                  <div class="buttonHolder">
                      <button class="button tick" type="submit"></button>


                  </div>
                 </center>
                </form>
                </div>
            </div>
        </div>
    </div>
</div>

{% endblock %}
浏览网页:

@login_required
@transaction.atomic
def update_home(request):

    user_form = UserForm(instance=request.user)
    profile_form = ProfileForm(instance=request.user.profile)
    return render(request, 'obs/homepage.html', {
        'user_form': user_form,
        'profile_form': profile_form
    })

你做的有点奇怪。您正试图通过表单访问已上载的文件,该文件的URL存储在模型的一个字段中。问题的直接原因是表单字段不知道URL,它只有一个值。您需要通过底层表单实例来访问它,该实例作为概要文件传入,因此,
{{profile\u form.instance.pro\u pic.url}

但我不明白你为什么要这么做。无论如何,显示内容不是表单的责任。您应该直接使用概要文件,该概要文件已经通过用户对象提供

{{ user.profile.pro_pic.url }}
对于第二个问题,您需要将上载的文件传递到表单:

profile_form = ProfileForm(request.POST, request.FILES, instance=request.user.profile)

首先,您需要创建媒体\u根目录并按照指定将上传到目录

MEDIA_ROOT=os.path.join(BASE_DIR,'obs/media')
pro_pic = models.ImageField(upload_to='profilepic',blank=True)
在上传配置文件pic的表单标签中,您需要添加以下enctype='multipart/form data'like

<form method="post" enctype="multipart/form-data" class="hello">.

profile_form = ProfileForm(request.POST, instance=request.user.profile, request.FILES or None)

希望这会有所帮助。

主页的视图是什么?它是否包含个人资料表单?@Daniel Roseman Yes我已经添加了负责主页的视图,我认为您需要使用
request.FILES
,如图所示,非常感谢。我第一次使用django。为我的愚蠢道歉。你解决了我的第一个问题。请检查第二个,在添加“{user.profile.pro_pic.url}”后,我得到“pro_pic”属性没有与之关联的文件。”如果用户没有任何配置文件pic,则在“homepage.html”的这一行中出现此错误
<form method="post" enctype="multipart/form-data" class="hello">.
profile_form = ProfileForm(request.POST, instance=request.user.profile) 
profile_form = ProfileForm(request.POST, instance=request.user.profile, request.FILES or None)