어떤 페이지에서 넘어왔는지를 알기 위해 해당 url를 받아와야 한다.
<a href={% url 'login' %}?next={{request.path}}>login~</a>
<a></a>
태그의 주소값 주목 ! <h1>로그인</h1>
<form action="{% url 'login' %}" method="POST">
{% csrf_token %}
Username: <input type="text" name="username" id="">
<br>
Password: <input type="password" name="password" id="">
<br>
<input type="hidden" name="next" value="{{ next }}">
<input type="submit" value="login" id="">
</form>
<form></form>
태그 안의 next input 주목 !<input type="hidden" name="next" value="{{ next }}">
로 redirect 되게 한다.def login(request):
if request.method == "POST":
username = request.POST["username"]
password = request.POST["password"]
next = request.POST["next"]
# name이 next인 input으로 받은 url 값
user = auth.authenticate(request, username=username, password=password)
if user is not None:
auth.login(request, user)
return redirect(next)
# next로 redirect
else:
return render(request, 'login.html', {'error': 'username or password is incorrect'})
else:
next = request.GET['next']
return render(request, 'login.html', {"next": next})
작성한 내용을 불러오기
<form method='post' action="{% url 'edit' blog.id %}" enctype="multipart/form-data">
{% csrf_token %}
<h4>title: </h4>
<input type="text" name="title" value='{{blog.title}}'>
<br>
<br>
<h4>body: </h4>
<textarea cols="40" rows="10" name="body">{{ blog.body }}</textarea>
<br>
<br>
<input type="text" name="latitude" id="map-lat" value="">
<input type="text" name="longitude" id="map-lng" value="">
<input type="file" name="image" id="imageUpload" accept="media/*">
<input type="submit" value="submit">
</form>
(사실 작성하는 페이지랑 다를 바 없다...)
title 부분에는 title을, body 부분에는 body를 그대로 띄운다.
이를 위해 views에서 해당 데이터를 blog라는 이름으로 불러올 것이다.
def edit(request, blog_id):
user = request.user # 현재 로그인한 사용자
blog = Blog.objects.get(id=blog_id, user=user)
# 현재 로그인한 사용자가 작성 && 수정하려는 기록의 id와 같은 데이터 객체
if request.method == "POST": # 사용자가 수정 완료를 누르면
blog.title = request.POST['title']
thumbnail = request.FILES.get('image')
if thumbnail != None:
blog.thumbnail = thumbnail
# 만약 섬네일 이미지를 새로 올렸다면 해당 이미지로 변경
blog.body = request.POST['body']
blog.user = user
blog.save()
# 바뀐 사항을 저장
return redirect('/blog/blog/'+str(blog_id))
else: # 사용자가 수정하기 페이지를 누른거면
return render(request, 'edit.html', {"blog": blog})
# edit.html 띄우고, "blog" 라는 이름으로 데이터 객체 부름
urlpatterns = [
path('write', blog.write, name="write"),
path('blog/<int:blog_id>', blog.detail, name="detail"),
path('create', blog.create, name="create"),
path('', blog.tempHome, name="tempHome"),
path('<int:blog_id>', blog.edit, name="edit"), # 수정하기 url
]
map과 연결시켜야 하고, 회원 관리도 구현하였기 때문에 수정하였다.
from django.db import models
from django.contrib.auth.models import User # User 모델 import 해오기
class Blog(models.Model):
title = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
thumbnail = models.ImageField(upload_to='images', default='default.jpg', null=True, blank=True)
body = models.TextField()
latitude = models.FloatField(blank=True, default=0) # for map 연결
longtitude = models.FloatField(blank=True, default=0) # for map 연결
address = models.CharField(max_length=100, default='대전') # for map 연결
user = models.ForeignKey(User, on_delete=models.CASCADE, default=1) # User 연결
def __str__(self):
return self.title
def summary(self):
return self.body[:100]
ForeignKey로 user를 두어 데이터를 연결해주었다.