首页 > 解决方案 > 为什么当我运行应用程序时媒体文件没有呈现并且没有显示?

问题描述

我正在使用 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.pymedia

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' %}"> &#8592; 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) 

但它仍然不起作用。我也读过一些关于同样问题的帖子,但不幸的是,我无法解决它。我将不胜感激您的帮助和建议。

这是我整个项目的链接。

标签: python-3.xdjangodjango-templatesjinja2

解决方案


此代码中的问题:

<img class="profile-pic" src="{{user.profile_photo.url}}" >

它应该是这样的:

<img class="profile-pic" src="{{request.user.myuser.profile_photo.url}}" >

因为在 html 文件中要获取您需要调用的当前用户request.user 并获取您需要首先访问 myuser 的个人资料照片


推荐阅读