Python Django映像未保存在数据库中
我正试图上传一张用户照片并在主页上显示 问题1:当我从管理部分上传一张图片时,它会保存在数据库中,但不会显示在“homepage.html”中 问题2:当我尝试使用“profile.html”模板上传图像时,图像甚至没有保存在数据库中 我尝试了stackoverflow的几种解决方案,但都没有解决我的问题。我的代码如下: models.pyPython 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
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)