in my django project
models.py =
from django.contrib.auth.models import AbstractUser
from django.db import models
from django.utils import timezone
class User(AbstractUser):
profile_pic = models.ImageField(upload_to='profile_pic/')
bio = models.TextField(max_length=160, blank=True, null=True)
cover = models.ImageField(upload_to='covers/', blank=True)
whatsapp = models.CharField(max_length=25, blank=True, null=True)
def __str__(self):
return self.username
def serialize(self):
return {
'id': self.id,
"username": self.username,
"profile_pic": self.profile_pic.url,
"first_name": self.first_name,
"last_name": self.last_name
}
class Post(models.Model):
creater = models.ForeignKey(User, on_delete=models.CASCADE, related_name='posts')
date_created = models.DateTimeField(default=timezone.now)
content_text = models.TextField(max_length=140, blank=True)
content_image = models.ImageField(upload_to='posts/', blank=True)
likers = models.ManyToManyField(User,blank=True , related_name='likes')
savers = models.ManyToManyField(User,blank=True , related_name='saved')
comment_count = models.IntegerField(default=0)
def __str__(self):
return f"Post ID: {self.id} (creater: {self.creater})"
def img_url(self):
return self.content_image.url
def append(self, name, value):
self.name = value
class Comment(models.Model):
post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments')
commenter = models.ForeignKey(User, on_delete=models.CASCADE, related_name='commenters')
comment_content = models.TextField(max_length=90)
comment_time = models.DateTimeField(default=timezone.now)
def __str__(self):
return f"Post: {self.post} | Commenter: {self.commenter}"
def serialize(self):
return {
"id": self.id,
"commenter": self.commenter.serialize(),
"body": self.comment_content,
"timestamp": self.comment_time.strftime("%b %d %Y, %I:%M %p")
}
class Follower(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='followers')
followers = models.ManyToManyField(User, blank=True, related_name='following')
def __str__(self):
return f"User: {self.user}"
views.py =
from django.contrib.auth import authenticate, login, logout
from django.db import IntegrityError
from django.http import HttpResponse, HttpResponseRedirect, JsonResponse
from django.shortcuts import render
from django.urls import reverse
from django.contrib.auth.decorators import login_required
from django.views.decorators.csrf import csrf_exempt
from django.core.paginator import Paginator
import json
from .models import *
def index(request):
all_posts = Post.objects.all().order_by('-date_created')
paginator = Paginator(all_posts, 10)
page_number = request.GET.get('page')
if page_number == None:
page_number = 1
posts = paginator.get_page(page_number)
followings = []
suggestions = []
if request.user.is_authenticated:
followings = Follower.objects.filter(followers=request.user).values_list('user', flat=True)
suggestions = User.objects.exclude(pk__in=followings).exclude(username=request.user.username).order_by("?")[:6]
return render(request, "network/index.html", {
"posts": posts,
"suggestions": suggestions,
"page": "all_posts",
'profile': False
})
def login_view(request):
if request.method == "POST":
# Attempt to sign user in
username = request.POST["username"]
password = request.POST["password"]
user = authenticate(request, username=username, password=password)
# Check if authentication successful
if user is not None:
login(request, user)
return HttpResponseRedirect(reverse("index"))
else:
return render(request, "network/login.html", {
"message": "Invalid username and/or password."
})
else:
return render(request, "network/login.html")
def logout_view(request):
logout(request)
return HttpResponseRedirect(reverse("index"))
def register(request):
if request.method == "POST":
username = request.POST["username"]
email = request.POST["email"]
fname = request.POST["firstname"]
lname = request.POST["lastname"]
profile = request.FILES.get("profile")
print(f"--------------------------Profile: {profile}----------------------------")
cover = request.FILES.get('cover')
print(f"--------------------------Cover: {cover}----------------------------")
# Ensure password matches confirmation
password = request.POST["password"]
confirmation = request.POST["confirmation"]
if password != confirmation:
return render(request, "network/register.html", {
"message": "Passwords must match."
})
# Attempt to create new user
try:
user = User.objects.create_user(username, email, password)
user.first_name = fname
user.last_name = lname
if profile is not None:
user.profile_pic = profile
else:
user.profile_pic = "profile_pic/no_pic.png"
user.cover = cover
user.save()
Follower.objects.create(user=user)
except IntegrityError:
return render(request, "network/register.html", {
"message": "Username already taken."
})
login(request, user)
return HttpResponseRedirect(reverse("index"))
else:
return render(request, "network/register.html")
def profile(request, username):
user = User.objects.get(username=username)
all_posts = Post.objects.filter(creater=user).order_by('-date_created')
paginator = Paginator(all_posts, 10)
page_number = request.GET.get('page')
if page_number == None:
page_number = 1
posts = paginator.get_page(page_number)
followings = []
suggestions = []
follower = False
if request.user.is_authenticated:
followings = Follower.objects.filter(followers=request.user).values_list('user', flat=True)
suggestions = User.objects.exclude(pk__in=followings).exclude(username=request.user.username).order_by("?")[:6]
if request.user in Follower.objects.get(user=user).followers.all():
follower = True
follower_count = Follower.objects.get(user=user).followers.all().count()
following_count = Follower.objects.filter(followers=user).count()
return render(request, 'network/profile.html', {
"username": user,
"posts": posts,
"posts_count": all_posts.count(),
"suggestions": suggestions,
"page": "profile",
"is_follower": follower,
"follower_count": follower_count,
"following_count": following_count,
"email": user.email,
})
def following(request):
if request.user.is_authenticated:
following_user = Follower.objects.filter(followers=request.user).values('user')
all_posts = Post.objects.filter(creater__in=following_user).order_by('-date_created')
paginator = Paginator(all_posts, 10)
page_number = request.GET.get('page')
if page_number == None:
page_number = 1
posts = paginator.get_page(page_number)
followings = Follower.objects.filter(followers=request.user).values_list('user', flat=True)
suggestions = User.objects.exclude(pk__in=followings).exclude(username=request.user.username).order_by("?")[:6]
return render(request, "network/index.html", {
"posts": posts,
"suggestions": suggestions,
"page": "following"
})
else:
return HttpResponseRedirect(reverse('login'))
def saved(request):
if request.user.is_authenticated:
all_posts = Post.objects.filter(savers=request.user).order_by('-date_created')
paginator = Paginator(all_posts, 10)
page_number = request.GET.get('page')
if page_number == None:
page_number = 1
posts = paginator.get_page(page_number)
followings = Follower.objects.filter(followers=request.user).values_list('user', flat=True)
suggestions = User.objects.exclude(pk__in=followings).exclude(username=request.user.username).order_by("?")[:6]
return render(request, "network/index.html", {
"posts": posts,
"suggestions": suggestions,
"page": "saved"
})
else:
return HttpResponseRedirect(reverse('login'))
@login_required
def create_post(request):
if request.method == 'POST':
text = request.POST.get('text')
pic = request.FILES.get('picture')
try:
post = Post.objects.create(creater=request.user, content_text=text, content_image=pic)
return HttpResponseRedirect(reverse('index'))
except Exception as e:
return HttpResponse(e)
else:
return HttpResponse("Method must be 'POST'")
@login_required
@csrf_exempt
def edit_post(request, post_id):
if request.method == 'POST':
text = request.POST.get('text')
pic = request.FILES.get('picture')
img_chg = request.POST.get('img_change')
post_id = request.POST.get('id')
post = Post.objects.get(id=post_id)
try:
post.content_text = text
if img_chg != 'false':
post.content_image = pic
post.save()
if(post.content_text):
post_text = post.content_text
else:
post_text = False
if(post.content_image):
post_image = post.img_url()
else:
post_image = False
return JsonResponse({
"success": True,
"text": post_text,
"picture": post_image
})
except Exception as e:
print('-----------------------------------------------')
print(e)
print('-----------------------------------------------')
return JsonResponse({
"success": False
})
else:
return HttpResponse("Method must be 'POST'")
@csrf_exempt
def like_post(request, id):
if request.user.is_authenticated:
if request.method == 'PUT':
post = Post.objects.get(pk=id)
print(post)
try:
post.likers.add(request.user)
post.save()
return HttpResponse(status=204)
except Exception as e:
return HttpResponse(e)
else:
return HttpResponse("Method must be 'PUT'")
else:
return HttpResponseRedirect(reverse('login'))
@csrf_exempt
def unlike_post(request, id):
if request.user.is_authenticated:
if request.method == 'PUT':
post = Post.objects.get(pk=id)
print(post)
try:
post.likers.remove(request.user)
post.save()
return HttpResponse(status=204)
except Exception as e:
return HttpResponse(e)
else:
return HttpResponse("Method must be 'PUT'")
else:
return HttpResponseRedirect(reverse('login'))
@csrf_exempt
def save_post(request, id):
if request.user.is_authenticated:
if request.method == 'PUT':
post = Post.objects.get(pk=id)
print(post)
try:
post.savers.add(request.user)
post.save()
return HttpResponse(status=204)
except Exception as e:
return HttpResponse(e)
else:
return HttpResponse("Method must be 'PUT'")
else:
return HttpResponseRedirect(reverse('login'))
@csrf_exempt
def unsave_post(request, id):
if request.user.is_authenticated:
if request.method == 'PUT':
post = Post.objects.get(pk=id)
print(post)
try:
post.savers.remove(request.user)
post.save()
return HttpResponse(status=204)
except Exception as e:
return HttpResponse(e)
else:
return HttpResponse("Method must be 'PUT'")
else:
return HttpResponseRedirect(reverse('login'))
@csrf_exempt
def follow(request, username):
if request.user.is_authenticated:
if request.method == 'PUT':
user = User.objects.get(username=username)
print(f".....................User: {user}......................")
print(f".....................Follower: {request.user}......................")
try:
(follower, create) = Follower.objects.get_or_create(user=user)
follower.followers.add(request.user)
follower.save()
return HttpResponse(status=204)
except Exception as e:
return HttpResponse(e)
else:
return HttpResponse("Method must be 'PUT'")
else:
return HttpResponseRedirect(reverse('login'))
@csrf_exempt
def unfollow(request, username):
if request.user.is_authenticated:
if request.method == 'PUT':
user = User.objects.get(username=username)
print(f".....................User: {user}......................")
print(f".....................Unfollower: {request.user}......................")
try:
follower = Follower.objects.get(user=user)
follower.followers.remove(request.user)
follower.save()
return HttpResponse(status=204)
except Exception as e:
return HttpResponse(e)
else:
return HttpResponse("Method must be 'PUT'")
else:
return HttpResponseRedirect(reverse('login'))
@csrf_exempt
def comment(request, post_id):
if request.user.is_authenticated:
if request.method == 'POST':
data = json.loads(request.body)
comment = data.get('comment_text')
post = Post.objects.get(id=post_id)
try:
newcomment = Comment.objects.create(post=post,commenter=request.user,comment_content=comment)
post.comment_count += 1
post.save()
print(newcomment.serialize())
return JsonResponse([newcomment.serialize()], safe=False, status=201)
except Exception as e:
return HttpResponse(e)
post = Post.objects.get(id=post_id)
comments = Comment.objects.filter(post=post)
comments = comments.order_by('-comment_time').all()
return JsonResponse([comment.serialize() for comment in comments], safe=False)
else:
return HttpResponseRedirect(reverse('login'))
@csrf_exempt
def delete_post(request, post_id):
if request.user.is_authenticated:
if request.method == 'PUT':
post = Post.objects.get(id=post_id)
if request.user == post.creater:
try:
delet = post.delete()
return HttpResponse(status=201)
except Exception as e:
return HttpResponse(e)
else:
return HttpResponse(status=404)
else:
return HttpResponse("Method must be 'PUT'")
else:
return HttpResponseRedirect(reverse('login'))
urls.py =
from django.urls import path
from django.conf import settings
from django.conf.urls.static import static
from . import views
urlpatterns = [
path("home", views.index, name="index"),
path("n/login", views.login_view, name="login"),
path("n/logout", views.logout_view, name="logout"),
path("n/register", views.register, name="register"),
path("<str:username>", views.profile, name='profile'),
path("n/following", views.following, name='following'),
path("n/saved", views.saved, name="saved"),
path("n/createpost", views.create_post, name="createpost"),
path("n/post/<int:id>/like", views.like_post, name="likepost"),
path("n/post/<int:id>/unlike", views.unlike_post, name="unlikepost"),
path("n/post/<int:id>/save", views.save_post, name="savepost"),
path("n/post/<int:id>/unsave", views.unsave_post, name="unsavepost"),
path("n/post/<int:post_id>/comments", views.comment, name="comments"),
path("n/post/<int:post_id>/write_comment",views.comment, name="writecomment"),
path("n/post/<int:post_id>/delete", views.delete_post, name="deletepost"),
path("<str:username>/follow", views.follow, name="followuser"),
path("<str:username>/unfollow", views.unfollow, name="unfollowuser"),
path("n/post/<int:post_id>/edit", views.edit_post, name="editpost")
]
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
the html file is inside a folder named network which is inside the templates folder
profile.html=
{% extends 'network/index.html' %}
{% load static %}
{% block profile %}
<div class="profile-view" data-user="{{username.username}}">
<div class="mbs-pec" id="mbs-pec" >
<form method="POST" class="mbs-pecc" style="display: block;" enctype="multipart/form-data">
{% csrf_token %}
<div id="mbs-ec" class="mbs-ec">
<div id="mbs-ecc" class="mbs-ecc1">
<p>cover image</p>
<div class="c-image" style="background-image: url(/media/{{username.cover}})"></div>
<input type="file" name="cover">
</div>
<div id="mbs-ecc" class="mbs-ecc2">
<p>profile image</p>
<div class="p-image" style="background-image: url(/media/{{username.profile_pic}})"></div>
<input type="file" name="profile_pic">
</div>
</div>
<div id="mbs-pecb" class="mbs-pecb a">
<p>First Name</p>
<input type="text" name="first_name" value="{{username.first_name}}">
</div>
<div id="mbs-pecb" class="mbs-pecb a">
<p>Last Name</p>
<input type="text" name="last_name" value="{{username.last_name}}">
</div>
<div id="mbs-pecb" class="mbs-pecb a">
<p>Username</p>
<input type="text" name="username" value="{{username.username}}">
</div>
<div id="mbs-pecb" class="mbs-pecb a">
<p>Bio</p>
<input type="text" name="bio" value="{{username.bio}}">
</div>
<div id="mbs-pecb" class="mbs-pecb a">
<p>Email</p>
<input type="email" name="email a" value="{{username.email}}">
</div>
<div id="mbs-pecb" class="mbs-pecb a">
<p>Whatsapp</p>
<input type="text" name="whatsapp" value="{{username.whatsapp}}">
</div>
<div id="mbs-pecb" class="mbs-pecb " >
<button class="mbs-done btn btn-outline-success" id="mbs-done">Done</button>
<button class="mbs-close btn btn-outline-success" id="mbs-close">Close</button>
</div>
</form>
</div>
<div class="cover-image" style="background-image: url(/media/{{username.cover}})"></div>
<div class="profile-image" style="background-image: url(/media/{{username.profile_pic}})"></div>
<div class="profile-details">
<div>
{% if user.username == username.username %}
<button class="btn btn-outline-success float-right" id="edit-profile-btn">Edit Profile</button>
{% elif is_follower %}
<button class="btn btn-success float-right" onclick="unfollow_user(this,'{{username.username}}','edit_page')" id="following-btn">Following</button>
{% else %}
<button class="btn btn-outline-success float-right" onclick="follow_user(this,'{{username.username}}','edit_page')" id="follow-btn">Follow</button>
{% endif %}
</div>
<div class="details-data">
<h5>{{username.first_name}} {{username.last_name}}</h5>
<div class="grey">@{{username.username}}</div>
<div class="whatsapp">
{% if username.whatsapp is not None %}
<a href="https://wa.me/{{username.whatsapp}}" target="_blank">Whatsapp</a>
{% endif %}
</div>
<div class="bio">
{% if username.bio is not None %}
{{username.bio}}
{% endif %}
</div>
<div class="grey" style="padding: 8px 0px;">
<svg width="1em" height="1em" viewBox="0 0 16 16" class="bi bi-calendar3" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" d="M14 0H2a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2zM1 3.857C1 3.384 1.448 3 2 3h12c.552 0 1 .384 1 .857v10.286c0 .473-.448.857-1 .857H2c-.552 0-1-.384-1-.857V3.857z"/>
<path fill-rule="evenodd" d="M6.5 7a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm3 0a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm3 0a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm-9 3a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm3 0a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm3 0a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm3 0a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm-9 3a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm3 0a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm3 0a1 1 0 1 0 0-2 1 1 0 0 0 0 2z"/>
</svg>
Joined {{username.date_joined | date:"F Y"}}
</div>
<div>
<strong>
{{posts_count}}
</strong>
<span class="grey">Posts</span>
 
<a href="#">
<strong id="following__count">{{following_count | default:0}}</strong> <span class="grey">Following</span>
</a>
 
<a href="#">
<strong id="follower__count">{{follower_count | default:0}}</strong> <span class="grey">Followers</span>
</a>
</div>
</div>
</div>
</div>
<div class="space"></div>
{% endblock %}
{% block emptyprofile %}
<center>
<br>
<strong style="font-size: 1.2em;">@{{username}} hasn't posted</strong>
<div class="grey" style="font-size: .9em;">When they do, their posts will show up here.</div>
</center>
{% endblock %}
focus on this part of the code
<div class="mbs-pec" id="mbs-pec" >
<form method="POST" class="mbs-pecc" style="display: block;" enctype="multipart/form-data">
{% csrf_token %}
<div id="mbs-ec" class="mbs-ec">
<div id="mbs-ecc" class="mbs-ecc1">
<p>cover image</p>
<div class="c-image" style="background-image: url(/media/{{username.cover}})"></div>
<input type="file" name="cover">
</div>
<div id="mbs-ecc" class="mbs-ecc2">
<p>profile image</p>
<div class="p-image" style="background-image: url(/media/{{username.profile_pic}})"></div>
<input type="file" name="profile_pic">
</div>
</div>
<div id="mbs-pecb" class="mbs-pecb a">
<p>First Name</p>
<input type="text" name="first_name" value="{{username.first_name}}">
</div>
<div id="mbs-pecb" class="mbs-pecb a">
<p>Last Name</p>
<input type="text" name="last_name" value="{{username.last_name}}">
</div>
<div id="mbs-pecb" class="mbs-pecb a">
<p>Username</p>
<input type="text" name="username" value="{{username.username}}">
</div>
<div id="mbs-pecb" class="mbs-pecb a">
<p>Bio</p>
<input type="text" name="bio" value="{{username.bio}}">
</div>
<div id="mbs-pecb" class="mbs-pecb a">
<p>Email</p>
<input type="email" name="email a" value="{{username.email}}">
</div>
<div id="mbs-pecb" class="mbs-pecb a">
<p>Whatsapp</p>
<input type="text" name="whatsapp" value="{{username.whatsapp}}">
</div>
<div id="mbs-pecb" class="mbs-pecb " >
<button class="mbs-done btn btn-outline-success" id="mbs-done">Done</button>
<button class="mbs-close btn btn-outline-success" id="mbs-close">Close</button>
</div>
</form>
</div>
here it is displaying the users first name in {{username.first_name}} last name in {{username.last_name}} user name in {{username.username}} bio in {{username.bio}} email in {{username.email}} whatsapp in {{username.whatsapp}} profile picture in <div class="p-image" style="background-image: url(/media/{{username.profile_pic}})"></div> and cover picture in <div class="c-image" style="background-image: url(/media/{{username.cover}})"></div> now what i want is that when i update the information in first name, last name, username, bio, email, whatsapp and click on the “Done” button Done it will change the information permanently.