python-3.x - 为什么当我运行应用程序时媒体文件没有呈现并且没有显示?
问题描述
我正在使用 Django 3.2.6,我只是一个初学者。我有一个项目(AwsomeWeb2
),其中有 4 个应用程序(Users, Posts, PasswordReset, Contact
)。我在用户中有一个类可以保存用户个人资料的信息:
class MyUser(models.Model):
user = models.OneToOneField(User, null=True, blank=True, on_delete=models.CASCADE)
first_name = models.CharField(max_length=50, null=True, blank=True)
last_name = models.CharField(max_length=50, null=True, blank=True)
mobile_number = models.CharField(max_length=20, unique=True, null=True, blank=True)
birthday = models.DateField( null=True, blank=True)
profile_photo = models.ImageField(default="images.png", null=True, blank=True,upload_to='profiles')
date_joined = models.DateTimeField(auto_now_add=True, null=True, blank=True)
country = models.CharField(max_length=15, null=True, blank=True)
city = models.CharField(max_length=15, null=True, blank=True)
region = models.CharField(max_length=15, null=True, blank=True)
address = models.TextField(null=True, blank=True)
postal_code = models.CharField(max_length=10, unique=True)
is_active = models.BooleanField(default=True)
user_email = models.EmailField(null=True, blank=True)
uni_name = models.ForeignKey('University' , on_delete=CASCADE , default='university name')
major_name = models.ForeignKey('Major' , on_delete=CASCADE , default='major name')
def __str__(self):
return f"{self.first_name} {self.last_name}"
User.profile = property(lambda u : MyUser.objects.get_or_create(user = u)[0])
我有一个字段profile_photo
用于保存用户的个人资料图片。我有一个forms.py
与此相关的表格model
:
class MyUserProfile(forms.ModelForm):
class Meta:
model= MyUser
fields = (
'first_name',
'last_name',
'mobile_number',
'birthday',
'profile_photo',
'country',
'city',
'region',
'address',
'postal_code',
'user_email'
)
我还在文件中添加了几setting.py
行media
:
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR,'media/')
当我创建配置文件时,我选择的照片将设置在AwsomeWeb2/media/profiles/
目录中,但是当我在服务器上运行我的应用程序时,它不会显示。这是我的views.py
功能:
@login_required(login_url='login')
def accountSettings(request):
if request.method == "POST":
user_account_form = MyUserProfile(request.POST , request.FILES, instance=request.user.profile)
if user_account_form.is_valid():
user_account_form.save()
messages.success(request, ('Your profile was successfully created(updated)!!'))
else:
messages.error(request, 'Error saving form')
return redirect("http://127.0.0.1:8000/")
else:
user = request.user
profile = user.profile
user_account_form = MyUserProfile(instance=profile)
context = {'form' : user_account_form}
return render(request , 'user/user.html' , context)
这是代码user.html
:
<!DOCTYPE html>
{% extends "base.html" %}
{% load static %}
<link rel="stylesheet" href="{{ STATIC_URL }}css/bootstrap/min.css" media="screen">
{% block content%}
{% load crispy_forms_tags %}
<style>
.profile-pic{
max-width: 200px;
max-height:200px;
margin: 0 auto;
border-radius: 50%;
}
</style>
<br>
<div class="row">
<div class="col-md-3">
<div class="card card-body">
<a class="btn btn-warning" href="{% url 'Posts:home' %}"> ← Back to Home</a>
<hr>
<h3 style="text-align: center">Account Settings</h3>
<hr>
{% if request.user.myuser.profile_photo %}
<img class="profile-pic" src="{{user.profile_photo.url}}" >
{% endif %}
</div>
</div>
<div class="col-md-9">
<div class="card card-body">
<form method="POST" action="" enctype="multipart/form-data">
{% csrf_token %}
{{form|crispy}}
<button class="btn btn-primary" type="submit">Update your profile</button>
</form>
</div>
</div>
</div>
{% endblock %}
而且我还添加media urls
到我的项目中urls.py
:
from django.contrib import admin
from django.urls import path, include
from django.contrib.auth import views as auth_views
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
path('admin/', admin.site.urls),
path('' , include('Posts.urls')),
path('contact/contactform/',include('Contact.urls')),
path('userforms/', include('Users.urls')),
path('resetpass/', include('PasswordReset.urls')),
# ####################################################
path('password_reset/done/' , auth_views.PasswordResetDoneView.as_view(template_name='password/password_reset_done.html'), name='password_reset_done'),
path('reset/<uidb64>/<token>' , auth_views.PasswordResetConfirmView.as_view(template_name='password/password_reset_confirm.html'), name='password_reset_confirm'),
path('reset/done/' , auth_views.PasswordResetCompleteView.as_view(template_name='password/password_reset_complete.html'), name='password_reset_complete'),
]
if settings.DEBUG:
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
但它仍然不起作用。我也读过一些关于同样问题的帖子,但不幸的是,我无法解决它。我将不胜感激您的帮助和建议。
这是我整个项目的链接。
解决方案
此代码中的问题:
<img class="profile-pic" src="{{user.profile_photo.url}}" >
它应该是这样的:
<img class="profile-pic" src="{{request.user.myuser.profile_photo.url}}" >
因为在 html 文件中要获取您需要调用的当前用户request.user
并获取您需要首先访问 myuser 的个人资料照片
推荐阅读
- java - 反应本机中的本机模块,不能在java类中调用“this”
- c++ - 我想按如下方式交换 map 的值,但它不起作用
- php - 在 PHP 中转义输出
- javascript - 将 JPEG 图像数组编码为 MPEG1
- javascript - Vue组件中的Javascript单击事件处理程序
- javascript - D3中的不规则滑块
- javascript - 如果单元格包含值,则可以从 Google 表格中的数据验证中选择复选框
- javascript - 如何使用 JS fetch API 发布表单数据和上传文件
- python - 如何在将 2 个字符串连接在一起时给出空格?
- vba - 将文件拖放到 Access 表单中的未绑定超链接框中