为什么当我 运行 应用程序时媒体文件不呈现也不显示?
Why media files are not rendered and are not shown when I run the application?
我正在使用 Django 3.2.6,我只是一个初学者。我有一个项目 (AwsomeWeb2
),其中有 4 个应用程序 (Users, Posts, PasswordReset, Contact
)。我在 Users 中有一个 class 用于保存用户配置文件的信息:
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)
但是还是不行。我也阅读了一些关于相同问题的帖子,但不幸的是,我无法解决。我将感谢您的帮助和建议。
这是我整个项目的 link。
这段代码中的问题:
<img class="profile-pic" src="{{user.profile_photo.url}}" >
应该是这样的:
<img class="profile-pic" src="{{request.user.myuser.profile_photo.url}}" >
因为在 html 文件中获取当前用户需要调用 request.user
要获取个人资料照片,您需要先访问 myuser
我正在使用 Django 3.2.6,我只是一个初学者。我有一个项目 (AwsomeWeb2
),其中有 4 个应用程序 (Users, Posts, PasswordReset, Contact
)。我在 Users 中有一个 class 用于保存用户配置文件的信息:
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)
但是还是不行。我也阅读了一些关于相同问题的帖子,但不幸的是,我无法解决。我将感谢您的帮助和建议。
这是我整个项目的 link。
这段代码中的问题:
<img class="profile-pic" src="{{user.profile_photo.url}}" >
应该是这样的:
<img class="profile-pic" src="{{request.user.myuser.profile_photo.url}}" >
因为在 html 文件中获取当前用户需要调用 request.user
要获取个人资料照片,您需要先访问 myuser