프로그래밍

221008 작심삼일 프로젝트 1일차 (뭘 만들지? - 백앤드 Django)

해아's 2022. 10. 8. 22:33

역시 작심삼일 인것처럼 시작도 늦엇다..

몇가지 배운걸로 프로그램을 도전해보려 한다.. 안배운것도 포함해서...

일단 프론트 엔드는 두종류

앱과 웹을 같이할거고

웹은 nginx 를 이용하고

앱은이걸보고 그대로 해볼것이다

https://www.youtube.com/watch?v=8eIQNfPbRms 

그리고 디자인은 무시... 추후 하나씩 고쳐보자

저정도면 프론트엔드는 끝.

백엔드는 지금 한창 배우고 있는 장고로 만들것이며

기능은

유저는 기본 유저에

테이블은 글쓰기 테이블 하나

정도로 구성된 심플 트위터를 구성해보려고 한다.

유저가 가입하고 단문글을 쓰고 저장하는 정도..

 

추후기능

더보기

유저 - 프로필꾸미기(사진,자기소개등등)

글쓰기 - 이미지 추가 및 태그

오늘 작업할것을 정리해보자

1. 장고셋팅 

- App 두개 (user , twitter )

django-admin startproject twitter_clone
py manage.py startapp twitter
py manage.py startapp user

-db 설정 및 m1에 맞는 pymsysql 설치

setting.py 상단 수정

import pymysql
pymysql.install_as_MySQLdb()

2. db설계 

 - db는 시도때도 없이 변경 가능하니 최소한으로 만든다.

- user table 은 기본 지원하는녀석으로 하고

- twitter table 은 ... 작성자(user테이블이랑 연결), 작성내용(장문다 포함), 추후 이미지(기본값 NULL), 작성일자

model.py

from django.contrib.auth.models import User
from django.db import models
#테이블생성
class Twitter(models.Model):
    writer = models.ForeignKey(User,on_delete=models.CASCADE) #작성자를 릴레이션 하는 필드
    contents = models.TextField() #트윗내용 저장되는 필드
    imgsrc = models.CharField(max_length=250) #이미지 경로 저장하는 필드 구분자는  |
    create_date = models.DateTimeField(auto_now_add=True) #작성일자

    def __str__(self): return self.writer
    




py manage.py makemigrations twitter
py manage.py migrate

git 에 만들어서 업로드 해두고 좀 쉬자.

 

3. 기능 구성

twitter

  - 작성글 /list

  - 글쓰기 /prog/new

  - 글수정 /porg/edit

  - 글삭제 /prog/del

app twitter > view.py

from django.shortcuts import redirect, render
from twitter.models import Twitter  # twitter 를 불러오기위한 twitter 모델불러오기
from twitter.froms import TwitterForm  # 게시판 폼을 만들어둔걸 불러오기위한 거
from django.db.models import Q
from django.contrib.auth.decorators import login_required
from django.contrib.auth import get_user_model  # 유저 목록 가져오기


# 새글작성함수
# prog 통합함수
@login_required(login_url='login') #게시글 작성 및 수정 삭제 모두 list 페이지에서 이루어 지므로 모두 list페이지로 보낸다.
def prog(request, type):
    if type == 'edit' or type == 'del':  # 작성자와 삭제 또는 수정자가 다를경우 게시판으로 다시보내자
        bid = request.GET.get('bid', None)
        post = Twitter.objects.get(Q(id=bid))
        if request.user != post.writer:
            return redirect('/list/')
    # 조건 타입이 뭔지 보자
    if type == 'new':  # 새 게시물 작성 /prog/new?bname=free /porg/read?id=3
        if request.method == "GET":
            twitterForm = TwitterForm()
            post = {'html_title': '새 게시물 작성'}
            return render(request, 'index.html', {'twitterForm': twitterForm, 'post': post})
        elif request.method == "POST":
            twitterForm = TwitterForm(request.POST)
            if twitterForm.is_valid():
                twitter = twitterForm.save(commit=False)
                twitter.writer = request.user
                twitter.save()
                return redirect('/list/')
    elif type == 'edit':  # 수정작업
        bid = request.GET.get('bid', None)
        post = Twitter.objects.get(Q(id=bid))
        if request.method == "GET":
            post.html_title = "게시물 수정"
            post.bid = post.id
            twitterForm = TwitterForm(instance=post)
            return render(request, 'index.html', {'post': post})
        elif request.method == "POST":
            bid = request.POST.get('bid', None)
            twitterForm = TwitterForm(request.POST)
            post = Twitter.objects.get(Q(id=bid))
            if twitterForm.is_valid():
                post.contents = twitterForm.cleaned_data['contents']
                post.save()
                return redirect('/list/')

        return redirect('/list/')
    elif type == 'read':  # 게시글 읽어와서 prog.html에 뿌려주기
        bid = request.GET.get('bid', None)
        post = Twitter.objects.get(id=bid)
        post.type = type
        return render(request, 'index.html', {'post': post})
    elif type == 'del':
        bid = request.GET.get('bid', None)
        post = Twitter.objects.get(id=bid)
        print(str(bid) + '번게시글 삭제')
        post.delete()
        return redirect('/list/')
    else:
        print("타입없음에러")
    return render(request, 'index.html')


# 리스트함수 게시판명별로 정렬추가
def list(request):
    posts = Twitter.objects.all().order_by('-id')
    users = get_user_model().objects.all()
    if request.user.is_authenticated:
        users.login_user = request.user

    return render(request, 'index.html',
                  {'posts': posts, 'request': request, 'users': users})
def mains(request):
    return render(request, 'index.html')

user

 - 회원가입/signup

 - 로그인/login

 - 로그아웃/logout

 

app user> view.py

from django.contrib.auth.forms import UserCreationForm, AuthenticationForm
from django.shortcuts import redirect,render
from django.contrib.auth import login as auth_login
from django.contrib.auth import logout as auth_logout
# Create your views here.
def signup(request):
    print('회원가입호출')
    if request.method == 'POST':
        signupForm = UserCreationForm(request.POST)
        if signupForm.is_valid():
            signupForm.save()
            print('회원가입성공')
            return redirect('/list/')
    else:
        signupForm = UserCreationForm()
    return render(request,'index.html',{'signupForm':signupForm})
def login(request):
    print('로그인호출')
    if  request.method == 'POST':
        loginForm = AuthenticationForm(request,request.POST)
        if loginForm.is_valid():
            auth_login(request,loginForm.get_user())

            return redirect('/list/')
        else:
            return redirect('/list/')
    else:
        loginForm = AuthenticationForm()
    return render(request,'index.html',{'loginForm':loginForm})
def logout(request):
    print('로그아웃성공')
    auth_logout(request)
    return redirect('/list/')

 - #추후 회원수정

4. 템플릿 구성 템플릿 디자인

 

 

 

 

오늘 여기까지

728x90
반응형