На сайте уже есть запросы по этому поводу, но ни один из них не решил мою проблему по факту. У меня есть таблица без базы данных с пользовательской таблицей, с таблицей моего изображения, которая показывает изображение профиля пользователя.
Models.py
class UserProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
avatar = models.ImageField(upload_to='profile_image', null=True, blank=True)
def __str__(self):
return str(self.user.first_name)
Views.py
@login_required()
def editaFoto(request, id):
data = {}
foto = UserProfile.objects.get(user_id=id)
form = UserProfileForm(request.POST or None, instance = foto) # inicia um formulario com os campos preenchidos
data['foto'] = foto
data['form'] = form
if request.method == 'POST':
if form.is_valid():
form.save()
return redirect('lista_perfil')
else:
return render(request, 'sistema/perfil/editafoto.html', data)
формы.py
class UserProfileForm(ModelForm):
class Meta:
model = UserProfile
fields = '__all__'
Editafoto.html
{% extends "base.html" %}
{% load bootstrap %}
{% block title %}
Editar Foto
{% endblock title %}
{% block main %}
<div class = "container">
<h3>Editar Foto</h3>
<div class = "row">
<div class = "col-sm-6">
{{ foto }}
<form action = "{% url 'edita_foto' user.id %}" method = "POST">
{% csrf_token %}
{{ form | bootstrap}}
<button type = "submit" class = "btn btn-success">Salvar</button>
<a href = "{% url 'lista_perfil' %}" class = "btn btn-danger">Cancelar</a>
</form>
</div>
</div>
</div>
{% endblock main %}
База.html
{% load static %}
<!DOCTYPE html>
<html lang = "pt">
<head>
<meta charset = "UTF-8">
<meta name = "viewport" content = "width=device-width, initial-scale=1.0">
<meta http-equiv = "X-UA-Compatible" content = "ie=edge">
<link rel = "icon" type = "imagem/png" href = "{% static 'img/icone.jpg' %}" />
<link rel = "stylesheet" href = "https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity = "sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin = "anonymous">
<script src = "https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity = "sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin = "anonymous"></script>
<script src = "https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity = "sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin = "anonymous"></script>
<script src = "https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity = "sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin = "anonymous"></script>
<link rel = "stylesheet" href = "{% static 'css/menu.css' %}">
{% block scripts %} {% endblock scripts %}
{% block style %} {% endblock style %}
<title>{% block title %} {% endblock title %}</title>
</head>
<body>
<nav class = "navbar navbar-expand-lg bg-dark navbar-dark" style = "margin-bottom:20px">
<a class = "navbar-brand" href = "#">Sistema</a>
<button class = "navbar-toggler" type = "button" data-toggle = "collapse" data-target = "#navbarNav" aria-controls = "navbarNav" aria-expanded = "false" aria-label = "Toggle navigation">
<span class = "navbar-toggler-icon"></span>
</button>
<div class = "collapse navbar-collapse" id = "navbarNav">
<ul class = "nav navbar-nav">
<li class = "nav-item active">
<a class = "nav-link" href = "{% url 'lista_consultas' %}">Consultas<span class = "sr-only">(current)</span></a>
</li>
<li class = "nav-item">
<a class = "nav-link" href = "{% url 'lista_medicos' %}">Medicos</a>
</li>
<li class = "nav-item">
<a class = "nav-link" href = "{% url 'lista_pacientes' %}">Pacientes</a>
</li>
<li class = "nav-item">
<a class = "nav-link" href = "{% url 'lista_especialidades' %}">Especialidades</a>
</li>
<li class = "nav-item">
<a class = "nav-link" href = "{% url 'cadastra_usuario' %}">Usuários</a>
</li>
</ul>
<ul class = "nav navbar-nav ml-auto">
{% if user.userprofile.avatar == "" %}
<img src = "{% static 'img/user-anonimo-clinica.jpg' %}" style = "border-radius: 100%; margin-top: .5rem;" width = "30" height = "30" alt = "user">
{% else %}
<img src = "{{ user.userprofile.avatar.url }}" style = "border-radius: 100%; margin-top: .5rem;" width = "30" height = "30" alt = "user">
{% endif %}
<li class = "nav-item dropdown ">
{% if user.is_authenticated %}
<a class = "nav-link dropdown-toggle" href = "#" id = "navbardrop" data-toggle = "dropdown">
{{user}}
</a>
<div class = "dropdown-menu dropdown-perfil">
<a class = "dropdown-item" href = "{% url 'lista_perfil' %}">Meu Perfil</a>
<a class = "dropdown-item" href = "{% url 'logout' %}">logout</a>
</div>
{% endif %}
</li>
</ul>
<!--
{% if user.is_authenticated %}
<li class = "nav-item">
<a class = "nav-link disabled" href = "">Olá {{user}}</a>
</li>
<li class = "nav-item">
<a class = "nav-link disabled" href = "{% url 'logout' %}">logout</a>
</li>
{% else %}
<li class = "nav-item">
<a class = "nav-link disabled" href = "{% url 'login' %}">login</a>
</li>
{% endif %}-->
</div>
</nav>
<div style = "margin-bottom: 40px">
{% block main %}
{% endblock %}
</div>
<footer class = "footer " style = "height:20px;width: 100%; background-color:#000; position: fixed; margin:auto; bottom:0">
</footer>
</body>
Этот мой текущий код отлично работает, когда я использую администратор Django. Если я войду в администрацию Django и добавлю изображение пользователю, изображение появится в системе нормально.
Но я хотел добавить изображение профиля пользователя в свою систему, но когда я захожу на страницу editafoto.html и даю отправку, он не сохраняет новое изображение в базе данных, не появляется ошибка, он просто не сохраняет и делает ничего не происходит
Может ли кто-нибудь показать мне, где я ошибаюсь?





Вы забыли добавить request.FILES в свой код.
UserProfileForm(request.POST or None, request.FILES or None, instance=foto)
также не забудьте добавить enctype = "multipart/form-data" к тегу <form>.
<form action = "{% url 'edita_foto' user.id %}" method = "POST" enctype = "multipart/form-data">
Вы добавили
enctype = "multipart/form-data"в свой тег<form>?