- Python Project | VSCode 기준
1. FEELSNS 최종 파일 구조
[프로젝트 구조]
- feelsns
- users
- templates
- fileupload.html
- login_page.html
- make_user.html
- profile_page.html
- modes.py
- urls.py
- views.py
- templates
[users/models]
from django.db import models
from django.contrib.auth.models import AbstractUser
from django.conf import settings
class UserModel(AbstractUser):
class Meta:
db_table = "user"
nickname = models.TextField(max_length=16, null=True, default='')
bio = models.CharField(max_length=500, blank=True, null=True)
user_images = models.ImageField(null=True, upload_to="images", blank=True)
follow = models.ManyToManyField(settings.AUTH_USER_MODEL,related_name='followee')
[users/urls]
from django.urls import path
from users import views
app_name = 'users'
urlpatterns = [
path('', views.home, name='home'),
path('login_page/', views.login_view, name='login_page'),
path('make_user/', views.make_user, name='make_user'),
path('logout/', views.logout, name='logout'),
path('profile_page/', views.user_view, name='profile_page'),
path('user/follow/<int:id>/', views.user_follow, name='user-follow'),
path('fileupload/', views.fileUpload, name='fileupload'),
]
[users/views]
from turtle import onclick
from django.shortcuts import render, redirect
from .models import UserModel
from django.contrib.auth import get_user_model
from django.contrib import auth
from django.contrib.auth.decorators import login_required
from .forms import FileUploadForm
def home(request):
user = request.user.is_authenticated
if user:
return redirect('/main_page')
else:
return redirect('/login_page')
def profile_page(request):
return render(request, 'profile_page.html')
def make_user(request):
if request.method == 'GET':
user = request.user.is_authenticated
if user:
return redirect('/')
else:
return render(request, 'make_user.html')
elif request.method == 'POST':
username = request.POST.get('username', '')
password = request.POST.get('password', '')
password2 = request.POST.get('password2', '')
nickname = request.POST.get('nickname', '')
if password != password2:
return render(request, 'make_user.html', {'error': '패스워드를 확인 해 주세요!'})
else:
if username == '' or password == '':
return render(request, 'make_user.html', {'error': '사용자 이름과 비밀번호는 필수 값 입니다!'})
exist_user = UserModel.objects.filter(username=username)
if exist_user:
return render(request, 'make_user.html', {'error': '사용자가 존재합니다'})
else:
UserModel.objects.create_user(username=username, password=password, nickname=nickname)
return redirect('/login_page')
def login_view(request):
if request.method == 'POST':
username = request.POST.get('username', '')
password = request.POST.get('password', '')
me = auth.authenticate(request, username=username, password=password)
# me = UserModel.object.get(username=username, password=password)
if me is not None:
auth.login(request, me)
return redirect('/') # 글쓰기 페이지
else:
return render(request, 'login_page.html',{'error':'유저이름 혹은 패스워드를 확인 해 주세요'})
elif request.method == 'GET':
user = request.user.is_authenticated # 사용자가 로그인 되어 있는지 검사
if user: # 로그인이 되어 있다면
return redirect('/')
else: # 로그인이 되어 있지 않다면
return render(request, 'login_page.html')
@login_required
def logout(request):
auth.logout(request)
return redirect('/login_page')
@login_required
def user_view(request):
if request.method == 'GET':
# 사용자를 불러오기, exclude와 request.user.username 를 사용해서 '로그인 한 사용자'를 제외하기
user_list = UserModel.objects.all().exclude(username=request.user.username)
return render(request, 'profile_page.html', {'user_list': user_list, 'user': request.user})
@login_required
def user_follow(request, id):
me = request.user
click_user = UserModel.objects.get(id=id)
if me in click_user.followee.all():
click_user.followee.remove(request.user)
else:
click_user.followee.add(request.user)
return redirect('/profile_page')
def fileUpload(request):
if request.method == 'POST':
nickname = request.POST['nickname']
bio = request.POST['bio']
img = request.FILES["user_images"]
user = request.user
user.nickname = nickname
user.bio = bio
user.user_images = img
user.save()
return redirect('/profile_page')
else:
fileuploadForm = FileUploadForm
context = {
'fileuploadForm': fileuploadForm,
}
return render(request, 'fileupload.html', context)
- post
- templates
- base.html
- detailed_post.html
- edit_post.html
- main_page.html
- make_post.html
- modes.py
- urls.py
- views.py
- templates
[post/models]
from django.db import models
from users.models import UserModel
class Post(models.Model):
title = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
body = models.TextField()
nickname = models.ForeignKey(UserModel, on_delete=models.CASCADE)
def __str__(self):
return self.title
class Comment(models.Model):
class Meta:
db_table = "Comment"
post = models.ForeignKey(Post, on_delete=models.CASCADE)
nickname = models.ForeignKey(UserModel, on_delete=models.CASCADE)
comment = models.TextField(max_length=3000, null=False, default='')
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.comment
[post/urls]
from django.urls import path
from post import views
app_name = 'post'
urlpatterns = [
path('main_page/', views.main_page, name='main_page'),
path('detailed_post/<int:post_id>', views.detailed_post, name='detailed_post'),
path('make_post/', views.make_post, name='make_post'),
path('create_post', views.create_post, name='create_post'),
path('detailed_post/<int:post_id>/edit_post', views.edit_post, name='edit_post'),
path('detailed_post/<int:post_id>/delete_post', views.delete_post, name='delete_post'),
path('detailed_post/<int:post_id>/comment/', views.write_comment, name='write_comment'),
path('detailed_post/comment/delete', views.delete_comment, name='delete_comment'),
]
[post/views]
from django.shortcuts import render, get_object_or_404
from .models import Post, Comment
from django.utils import timezone
from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
from .forms import Postedit, CommentForm
from django.views.generic import ListView, TemplateView
def main_page(request):
posts = Post.objects.order_by('-id')
return render(request, 'main_page.html', {'posts':posts})
@login_required
def make_post(request):
return render(request, 'make_post.html')
@login_required
def create_post(request):
user = request.user
post = Post()
post.title = request.POST.get('title')
post.body = request.POST.get('body')
post.pub_date = timezone.datetime.now()
post.nickname = user
post.save()
return redirect('/detailed_post/' + str(post.id))
@login_required
def detailed_post(request, post_id):
post_detail = get_object_or_404(Post, pk=post_id)
write_comment = Comment.objects.filter(post_id=post_id).order_by('-created_at')
return render(request, 'detailed_post.html', {'post': post_detail, 'comment': write_comment})
@login_required
def new_post(request):
full_text = request.GET['fulltext']
word_list = full_text.split()
word_dictionary = {}
for word in word_list:
if word in word_dictionary:
# Increase
word_dictionary[word] += 1
else:
# add to the dictionary
word_dictionary[word] = 1
return render(request, 'make_post.html', {'fulltext': full_text, 'total': len(word_list), 'dictionary': word_dictionary.items()} )
@login_required
def edit_post(request, post_id):
post = Post.objects.get(id=post_id)
if request.method =='POST':
form = Postedit(request.POST)
if form.is_valid():
user = request.user
post.title = form.cleaned_data['title']
post.body = form.cleaned_data['body']
post.pub_date=timezone.now()
post.nickname = user
post.save()
return redirect('/detailed_post/' + str(post.id))
else:
form = Postedit(instance = post)
return render(request,'edit_post.html', {'form':form})
@login_required
def delete_post(request, post_id):
post = Post.objects.get(id=post_id)
post.delete()
return redirect('/')
def write_comment(request, post_id):
if request.method == 'POST':
comment = request.POST.get('comment','')
current_post = Post.objects.get(id=post_id)
C = Comment()
C.comment = comment
C.nickname = request.user
C.post = current_post
C.save()
return redirect('/detailed_post/'+str(post_id))
@login_required
def delete_comment(request, post_id):
comment = Comment.objects.get(id=post_id)
comment.delete()
return redirect('/detailed_post/'+str(post_id))
2. git 협업
- 가상환경 제거 및 리드미 상세하게하기
GitHub - wonprogrammer/FEELSNS: A5 | 2_team_project
A5 | 2_team_project. Contribute to wonprogrammer/FEELSNS development by creating an account on GitHub.
github.com
- git branch 작업
- git branch 브랜치 명
- git checkout 브랜치 명
- git add . / git commit -m ‘커밋 메세지’ / git push origin 브랜치 명
- git에서 집접 pull request
- (git checkout main)
- (git pull origin main) / git pull main branch link
'woncoding > TIL' 카테고리의 다른 글
| TIL | 10.11.화 [Django🐢] (0) | 2022.10.11 |
|---|---|
| TIL | 10.7.금 [머신러닝] (1) | 2022.10.11 |
| TIL | 10.5.수 [Django Project] (0) | 2022.10.06 |
| TIL | 10.4.화 [Django Project] (0) | 2022.10.05 |
| TIL | 9.29.목 [Django 기초🐢] (0) | 2022.09.30 |