반응형
from django.forms import ModelForm
from django import forms
from third.models import Restaurant, Reviews
from django.utils.translation import gettext_lazy as _
REVIEW_POINT_CHOICES = (
('1', 1),
('2', 2),
('3', 3),
('4', 4),
('5', 5)
)
class ReviewForm(ModelForm):
class Meta:
model = Reviews
fields = ['point', 'comment', 'restaurant']
labels = {
'point': _('평점'),
'comment': _('코멘트')
}
help_texts = {
'point': _('평점을 입력해주세요.'),
'comment': _('코멘트를 입력해주세요.')
}
widgets = {
'restaurant': forms.HiddenInput(),
'point': forms.Select(choices=REVIEW_POINT_CHOICES)
}
class RestaurantForm(ModelForm):
class Meta:
model = Restaurant
fields = ['name', 'address', 'password']
labels = {
'name': _('이름'),
'address': _('주소'),
'image': _('이미지 url'),
'password': _('게시물 비밀번호')
}
help_texts = {
'name': _('이름을 입력해주세요.'),
'address': _('주소를 입력해주세요.'),
'image': _('이미지의 url을 입력해주세요.'),
'password': _('게시물 비밀번호를 입력해주세요.')
}
widgets = {
'password': forms.PasswordInput()
}
error_messages = {
'name': {
'max_length': _('이름이 너무 깁니다. 30자 이하로 작성해주세요.')
},
'image': {
'max_length': _('이미지 주소의 길이가 너무 깁니다. 500자 이하로 작성해주세요.')
},
'password': {
'max_length': _('비밀번호가 너무 깁니다. 20자 이하로 작성해주세요.')
}
}
class UpdateRestaurantForm(RestaurantForm):
class Meta:
model = Restaurant
exclude = ['password']
▶ 기존의 forms.py 파일의 RestaurantForm 메소드에 image와 password를 추가
▶ classUpdateRestaurantForm : 비밀번호가 일치하는 경우 게시글을 수정할 수 있는 메소드 작성
▶ exclude = ['password'] : 게시글을 수정할 때 비밀번호는 수정되어서는 안 되기 때문에 Restaurant에서 모델을 받아오지만 password는 포함시키지 않음
from django.shortcuts import render, get_object_or_404, redirect
from third.models import Restaurant, Reviews
from django.core.paginator import Paginator
from third.forms import RestaurantForm, ReviewForm, UpdateRestaurantForm
from django.http import HttpResponseRedirect
from django.db.models import Count, Avg
# Create your views here.
def list(request):
restaurants = Restaurant.objects.all().annotate(reviews_count=Count('reviews'))\
.annotate(average_point=Avg('reviews__point'))
paginator = Paginator(restaurants, 5)
page = request.GET.get('page')
items = paginator.get_page(page)
context = {
'restaurants': items
}
return render(request, 'third/list.html', context)
def create(request):
if request.method == 'POST':
form = RestaurantForm(request.POST)
if form.is_valid():
new_item = form.save()
return HttpResponseRedirect('/third/list/')
form = RestaurantForm()
return render(request, 'third/create.html', {'form': form})
def update(request):
if request.method == 'POST' and 'id' in request.POST:
# item = Restaurant.objects.get(pk=request.POST.get('id'))
item = get_object_or_404(Restaurant, pk=request.POST.get('id'))
password = request.POST.get('password', '')
form = UpdateRestaurantForm(request.POST, instance=item)
if form.is_valid() and password == item.password:
item = form.save()
elif request.method == 'GET':
# item = Restaurant.objects.get(pk=request.GET.get('id'))
item = get_object_or_404(Restaurant, pk=request.GET.get('id'))
form = RestaurantForm(instance=item)
return render(request, 'third/update.html', {'form': form})
return HttpResponseRedirect('/third/list/')
def detail(request, id):
if 'id' is not None:
item = get_object_or_404(Restaurant, pk=id)
reviews = Reviews.objects.filter(restaurant=item).all()
return render(request, 'third/detail.html', {'item': item, 'reviews': reviews})
return HttpResponseRedirect('/third/list/')
def delete(request):
if 'id' in request.GET:
item = get_object_or_404(Restaurant, pk=request.GET.get('id'))
item.delete()
return HttpResponseRedirect('/third/list/')
def review_create(request, restaurant_id):
if request.method == 'POST':
form = ReviewForm(request.POST)
if form.is_valid():
new_item = form.save()
return redirect('restaurant-detail', id=restaurant_id)
item = get_object_or_404(Restaurant, pk=restaurant_id)
form = ReviewForm(initial={'restaurant': item})
return render(request, 'third/review_create.html', {'form': form, 'item': item})
def review_delete(request, restaurant_id, review_id):
item = get_object_or_404(Reviews, pk=review_id)
item.delete()
return redirect('restaurant-detail', id=restaurant_id)
def review_list(request):
reviews = Reviews.objects.all().select_related().order_by('-created_at')
paginator = Paginator(reviews, 10)
page = request.GET.get('page')
items = paginator.get_page(page)
context = {
'reviews': items
}
return render(request, 'third/review_list.html', context)
▶ 기존의 비밀번호와 수정 화면에서 새로 입력받은 비밀번호가 일치하는지 확인하는 구문을 views.py의 update 메소드에 작성
반응형
'Django > inflearn' 카테고리의 다른 글
삭제 시 비밀번호 적용하기 (0) | 2022.12.10 |
---|---|
기존 모델에 새 컬럼(필드) 추가하기 (0) | 2022.12.08 |
Join으로 모든 리뷰 리스트 불러오기 (0) | 2022.12.07 |
리스트 화면에서 리뷰 개수와 평점 구하기 (0) | 2022.12.06 |
Join 개요 (0) | 2022.12.05 |