[다시, 장고]Muklog - redirect, 먹기록 수정, 블로그 모델 수정

Adela·2020년 7월 17일
1

다시, 장고

목록 보기
4/6
post-thumbnail
post-custom-banner

오늘까지 진행한 것들

  • 이전페이지로 redirect
  • 먹기록 수정
  • 블로그 모델 수정

이전페이지로 redirect

어떤 페이지에서 넘어왔는지를 알기 위해 해당 url를 받아와야 한다.

html

  • 로그인을 진행할 때 해당 페이지의 url을 받아오기 위한 input을 만든다.
 <a href={% url 'login' %}?next={{request.path}}>login~</a>
  • 로그인 html로 들어가기 위한 <a></a> 태그의 주소값 주목 !
    "로그인 url + 현재 path를 next라는 변수에 담은 형태"로 되어있다.
    👉🏻 즉, 현재 path를 request로 받은 값을 next라는 변수에 담아 login url 뒤에 붙여주는 것이다.
 <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 되게 한다.
    👉🏻 즉, 로그인 페이지로 들어올 때, login url 뒤에 붙어있던 next 변수 안에 담긴 path로 redirect 하는 것이다.

views

  • html에서 input을 통해 받은 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})

먹기록 수정

작성한 내용을 불러오기

html

  • 수정하는 페이지를 만든다.
  • 수정 시 작성한 내용이 그대로 보여진다.
   <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라는 이름으로 불러올 것이다.

views

  • 수정하는 detail 페이지에 대한 데이터를 불러와 띄운다.
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" 라는 이름으로 데이터 객체 부름 

urls

  • 수정하기 위한 주소를 할당해준다.
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과 연결시켜야 하고, 회원 관리도 구현하였기 때문에 수정하였다.

models

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를 두어 데이터를 연결해주었다.

(자잘한) 앞으로의 수정 방향

  • 회원별로 기록 목록이 다르기 나오도록 하기 (자기가 쓴 것만 나오도록)
  • 로그인 하면 로그아웃 뜨게 하기
  • 로그인, 로그아웃, 회원가입 부분을 base.html과 같은 페이지에 넣어 상속하기
profile
개발 공부하는 심리학도
post-custom-banner

0개의 댓글