Django - Изображения не будут загружаться и изменяться на странице моего профиля - PullRequest
0 голосов
/ 18 апреля 2020

Я работаю над страницей профиля моего веб-сайта.
Изменение имени пользователя или адреса электронной почты работает, но не изображение профиля, и я не понимаю, почему: (

Я добавил свое приложение профиля в " INSTALLED_APPS ", установите MEDIA_ ROOT и MEDIA_URL и установите urlspatterns:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'home.apps.HomeConfig',
    'inscription.apps.InscriptionConfig',
    'profil.apps.ProfilConfig',
]

[...]

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

urls.py:

urlpatterns = [
    path('profil/', p.profil, name='profil'),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Я связал пользователя с его профилем и установил изображение по умолчанию в models.py

from django.db import models
from django.contrib.auth.models import User

class Profil(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    image = models.ImageField(default='defaut.png', upload_to='image_profil')

    def __str__(self):
        return f'{self.user.username} Profil'

admin.py:

from django.contrib import admin
from .models import Profil

admin.site.register(Profil)

Затем я создал форму изменения профиля в forms.py:

from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
from .models import Profil

class FormulaireModifUtilisateur(forms.ModelForm):
    username = forms.CharField(
        label = 'Nom de compte',
        min_length = 4,
        max_length = 150,
        initial=User.username,
    )
    email = forms.EmailField(
        label = 'Email',
        min_length = 4,
        max_length = 150,
    )

    class Meta:
        model = User
        fields = ['username', 'email']

class FormulaireModifProfil(forms.ModelForm):
    image = forms.FileField(
        label = 'Image de profil'
    )
    class Meta:
        model = Profil
        fields = ['image']

Затем Я использовал его в views.py:

from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
from django.contrib import messages
from .forms import FormulaireModifUtilisateur, FormulaireModifProfil

@login_required

def profil(request):
    if request.method == 'POST':
        u_form = FormulaireModifUtilisateur(
            request.POST,
            instance=request.user
        )
        p_form = FormulaireModifProfil(
            request.POST,
            request.FILES,
            instance=request.user.profil
        )
        if u_form.is_valid() and p_form.is_valid():
            u_form.save()
            p_form.save()
            messages.success(request, f'Votre compte a bien été mis à jour !')
            return redirect('profil')

    else:
        u_form = FormulaireModifUtilisateur(instance=request.user)
        p_form = FormulaireModifProfil()

    context = {
        'u_form': u_form,
        'p_form': p_form,
    }

    return render(request, 'profil/profils.html', context)

И, наконец, я создал страницу своего профиля:

{% extends "home/index.html" %}

{% block title %}
Profil
{% endblock %}

{% block content %}
<div id='profil'>
    <img src='{{ user.profil.image.url }}'>
    <form method="post">
        {% csrf_token %}
        {% for field in u_form %}
            <p>
                {{ field.label_tag }}<br>
                {{ field }}<br>
            </p>
        {% endfor %}
        {% for field in p_form %}
            <p>
                {{ field.label_tag }}<br>
                {{ field }}<br>
            </p>
        {% endfor %}
        {% for message in messages %}
            <p id="messages">{{message}}</p>
        {% endfor %}
    <button type="submit">Enregistrer</button>
    </form>
</div>
{% endblock %}

Я посмотрел ответы на аналогичные вопросы, но ничего не получилось: (

1 Ответ

0 голосов
/ 18 апреля 2020

Вы должны добавить enctype, когда используете файлы в форме HTML.

<form method="post" enctype="multipart/form-data">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...