[django 개발 toolBox]장고 admin 페이지 이쁘게 만들기- Django Grappelli 설치하기
Admin 페이지를 간단하게 꾸미는 장고 패키지 중에서
Django Grappelli 를 설치하는것을 안내해 드립니다.
*장고 개발 toolBox는 여러분의 장고 개발시 필요한 유용한 도구들을
찾아 소개해 드립니다.
이글만 보기
[django toolBox] 장고 DEBUG = FALSE 에서 정적 파일과 미디어 읽기
settings.py에서 작업하실때는 디버그의 기본은 debug=True 입니다. 그러나
실제로 서비스를 할때는 보안상 debug=False 로 해서 끕니다. 그러나 이때부터 Django는 더 이상 정적 파일을 처리하지 않습니다.
여러분 호스팅 환경의 웹 서버(Apache 등)가 이를 처리해야 합니다.
그러나 간단하게 다음과 같은 방법도 사용이 가능합니다.
다음의 안내를 따르시면 됩니다.
1.먼저 debug = False와 Allowed_HOSTS 처리를 합니다. 예시에서는 ALLOWED_HOSTS가 * 이지만, 실제 사용할때는
반드시 여러분의 도메인을 사용합니다. (로칼에서 테스트할때는 locahost또는 IP)
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = False
ALLOWED_HOSTS = ['*']
2 settings.py 에서 STATIC_ROOT 와 MEDIA_ROOT 경로를 정의합니다.
STATIC_URL = '/static/'
MEDIA_URL = '/media/'
if DEBUG:
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
else:
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
3. 그리고 루트 수준의 urls.py에서(settings.py가 있는 폴더) 정적 URL에서 STATIC_ROOT 와 MEDIA_ROOT 에 연결되도록 다음과 같이 정의합니다.
from django.conf.urls import url
from django.conf import settings
from django.views.static import serve
urlpatterns = [
url(r'^media/(?P<path>.*)$', serve,{'document_root': settings.MEDIA_ROOT}),
url(r'^static/(?P<path>.*)$', serve,{'document_root': settings.STATIC_ROOT}),
]
또한 여러분은 장고를 실제 서비스 하기 전에 다음의 배포 전 체크리스트를 확인해 보실 것을 추천드립니다.
배포 전 체크리스트(장고 공식 문서)
이글만 보기
[django toolBox]파이썬 장고 Taggit을 이용한 태그 검색 기능 구현하기 1
해시태그(hashtag)는 메타데이터 태그로, 해시 기호(#) 뒤에 특정 단어를 쓰면 그 단어에 대한 글을 모아 분류해서 볼 수 있게 합니다.
관련된 내용물을 묶어주는 역할을 해 사용자들이 관심 있는 주제의 내용물을 쉽게 찾을 수 있도록 도와주는데요,
여기서는 이 태그 기능을 django-taggit 을 이용해 손쉽게 구현해 봅니다.
작업 목표: 이 사이트에는 강좌, 레슨, 블로그 등이 있다. 이것을 같은 주제로 태그로 연결하게 할 것이다. 하나의 앱의 태그만 아니라 즉 여러앱을 태그로 연결하는 것이다.
설치
pip install django-taggit
settings.py
INSTALLED_APPS
에 taggit 추가.
# Application definition
INSTALLED_APPS = [
'taggit', #taggit 추가
]
모델에 필드 추가 예시. 블로그의 경우
from taggit.managers import TaggableManager
class blogPost(models.Model):
author = models.ForeignKey(User,on_delete=models.CASCADE)
title = models.CharField(max_length=30)
text = HTMLField()
tags = TaggableManager() #태그 추가
created_date = models.DateTimeField(default=timezone.now)
def get_absolute_url(self):
return reverse("blogs:post_detail", kwargs={"pk": self.pk})
def __str__(self):
return self.title
마이그레잇
python manage.py migrate
우리는 여러 앱에서 태그를 사용하게 할것이므로 context_processors.py 이용 태그를 글로벌 하게 사용가능하게 해야 한다.
context-processors 는 HttpRequest를 인수로 사용하고 사전형(dict) 반환해준다.
코드의 예시를 보자. 위에서 말한 내용처럼 HttpRequest를 인수로 받으며 우리가 작업할 tag를 dict형을 반환하는 간단한 함수를 제작한다.
from taggit.models import Tag
def tags(request):
return {'tags': Tag.objects.all()}
생성한 함수를 어디서든 불러올 수 있어야하므로 settings.py의 template(template변수로 사용할 것이므로)의 options 아래의 context_processors에 넣어준다.
'OPTIONS': {
'context_processors': [
'blog.context_processors.tags',#장고 태그 작업 중
],
태그 입력을 위한 forms.py 작업 예시
class PostForm(forms.ModelForm):
text = forms.CharField(
widget=TinyMCEWidget(
attrs={'required': False, 'cols': 30, 'rows': 10}
)
)
class Meta:
model= blogPost
fields = ['title','text','tags']
help_texts = {
'title': '글의 제목을 입력하세요',
'text': '글을 적어 주세요',
'tags': '태그 - 관련 주제를 콤마(,)로 구분해 입력해 주세요'
}
def save_form(self, request, instance, form, change):
user = request.user
instance = form.save(commit=False)
if not change or not instance.author:
instance.author = user
instance.modified_by = user
instance.save()
form.save_m2m()
return instance
추가로 태그 쿼리를 위한 views.py 작업의 예시도 추가하니 참고해 주세요.
class PostListView(ListView):
context_object_name = 'posts'
template_name = 'blog/post_list.html'
#ordering = ['-created_date']
#model = blogPost
def get_queryset(self):
queryset = blogPost.objects.all().order_by('-created_date')
tag = self.request.GET.get('tag')
if tag:
queryset = queryset.filter(tags__name=tag)
return queryset
html에 추가
이제 준비는 다 끝났다 그대로 가져와 사용만 하면 된다.
<div class="tags">
{% for tag in tags %}
<a href="{% url 'blogs:post_list' %}?tag={{tag.name}}"> {{tag.name}}</a>
{% endfor %}
</div>
실전 과제: 이 태그로 이루어진 블로그 외에 강좌와 레슨도 모두 연결해 보세요. 예를 들어 장고라는 태그를 클릭하면
이 블로그 페이지에 블로그와 강좌, 레슨이 모두 연결되어 나오는 로직을 구현해 보세요.
직접 한번 해 보신 후 다음의 2편을 보시길 추천드립니다.
이글만 보기
[django toolBox]장고 django-allauth 2 회원가입 이메일 인증 처리
회원가입 인증 이메일을 처리 과정을 장고 올오뜨를 이용해 간단하게 구현해 봅니다.
Django SMTP 설정
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = '123@gmail.com'
EMAIL_HOST_PASSWORD = '123'
EMAIL_PORT = 587
django-allauth 셋팅
ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_EMAIL_VERIFICATION = "mandatory"
이글만 보기
완전 무료 호스팅! 운영도 무료 ! 샵투 울트라 쇼핑몰!
대부분 닭장 호스팅 환경들이 미래를 위한 제시를 못하고,
아마존 aws 이나 구글 cloud 이용하면 생각보다 어렵고 ..
트래픽이나 서비스에 대한 추가 요금으로 배움을 위한 투자로 이용하기엔 돈이 자꾸 나가..
씩씩 거리며 계정 막아버리면, 또 어디서 복잡해 정리 못한 서비스가 있어 또 돈이 나가 ㅠㅠ
누구냐! 내 홈피 들어간 인간들이 이러면서 그냥 씩씩거리며 몽땅 정리하신 경험들 많죠?
그런 분들을 위해 만들었습니다.
완전 무료 . 운영도 무료!
무료로 쇼핑몰을 만드세요!
누구나 쉽게 설치방법 따라 하기만 하면 무료 호스팅으로 무료 쇼핑몰을 가집니다.!
더구나 강의도 있어서 직접 개발까지 하면서 미래 지향적으로 갈 수 있습니다!
모든 소스에 대한 설명을 통해 끔임없이 강의와 함께 배우는 샵투울트라 쇼핑몰 !
업데이트를 통한 고도화된 발전도 영원히 계속된다 !!
유튜브 강의로 따라만들기
결과물 보기 : 울트라 쇼핑몰
소스코드
https://github.com/shop2world/ultrashop
이글만 보기
[django toolBox] 장고 mailchimp 연동하기
[django toolBox] 장고 mailchimp 연결하기
1.html 입력 폼
<h4>뉴스레터</h4>
<form action="/newsletter/" method="POST" class="footer-newslatter">
{% csrf_token %}
<input type="email" placeholder="이메일 입력" name="newsemail">
<button type="submit" class="site-btn">구독하기</button>
<p>*최신 기술 뉴스를 받아보세요</p>
</form>
2.Views
from django.conf import settings
from mailchimp_marketing import Client
from mailchimp_marketing.api_client import ApiClientError
# Mailchimp Settings
api_key = settings.MAILCHIMP_API_KEY
server = settings.MAILCHIMP_DATA_CENTER
list_id = settings.MAILCHIMP_EMAIL_LIST_ID
# 메일침프 구독
def subscribe(newsemail):
mailchimp = Client()
mailchimp.set_config({
"api_key": api_key,
"server": server,
})
member_info = {
"email_address": newsemail,
"status": "subscribed",
}
try:
response = mailchimp.lists.add_list_member(list_id, member_info)
print("response: {}".format(response))
except ApiClientError as error:
print("An exception occurred: {}".format(error.text))
def newsletter(request):
if request.method == "POST":
newsemail = request.POST['newsemail']
subscribe(newsemail)
messages.success(request, "뉴스레터 이메일 구독에 감사합니다!") # 구독감사메세지
return redirect('courses:home')
3.연결
from django.urls import path
from users.views import newsletter
urlpatterns = [
path('newsletter/', newsletter, name='newsletter'),
]
4.장고 메일침프 설치
pip install mailchimp-marketing
5.settings.py
# MAILCHIMP CREDENTIALS
MAILCHIMP_API_KEY = ""
MAILCHIMP_DATA_CENTER = ""
MAILCHIMP_EMAIL_LIST_ID = ""
이글만 보기
[django toolBox] 메일폼 보내기 contact form 만들기 (모델 없이 views와 gmail 또는 메일건 mailgun 이용)
[django toolBox] 는 장고 사용에 필요한 기능들을 군더더기 없이 짧고 간편하게 설명합니다.
django를 이용해 신청서나 폼메일등에서 Gmail의 smtp로 메일을 발송하는 방법을 소개합니다.
장고를 이용한 폼메일로 이번에는 model을 만들지 말고 바로 이메일만 보내보도록 하겠습니다.
또 gmail 에 이어서 mailgun을 smtp로 사용하는 것도 배우게 됩니다.
만약 model 을 이용한 폼메일 제작은 [django toolBox] Gmail의 smtp를 백엔드로 이용하여 메일 보내기 contact form 만들기 (모델 이용)
을 참고해 주세요.
1.먼저 gmail의 보안수준을 낮게 설정해야 합니다.
https://myaccount.google.com/lesssecureapps
2.settings.py 수정
EMAIL_HOST='smtp.gmail.com'
EMAIL_HOST_USER='123@gmail.com'
EMAIL_HOST_PASSWORD='123123123'
EMAIL_PORT = 587
3.html 폼 입력 받기
<!-- contact form -->
<form action="/question/" method="post" class="signup-form">{% csrf_token %}
<input type="text" placeholder="성함" name="name">
<input type="text" placeholder="이메일" name="e-mail">
<textarea placeholder="하실말씀" name="text">
</textarea>
<button class="site-btn">문의</button>
</form>
4.view만들기
def 문의뷰(request):
if request.method == 'POST':
name = request.POST.get('name')
email = request.POST.get('e-mail')
text = request.POST.get('text')
message = '안녕하세요! 샵투 스쿨입니다.문의가 접수 되었습니다! 빠른시간내에 답변 드리겠습니다!'
send_mail(
'안녕하세요, 샵투스쿨 문의 요청이 접수 되었습니다.',
message,
'보낸사람@gmail.com',
[email],
fail_silently=False,
)
send_mail(
'shop2',
'누군가 문의 요청했습니다. 문의 정보: ' + name + ' , ' + email + ' , ' + text + ' , ' + '.',
'보낸사람@gmail.com',
['벋는사람@gmail.com'],
fail_silently=False,
)
messages.info(request, f'요청이 성공적으로 접수 되었습니다. 이메일을 확인 해 주세요.')
return redirect('courses:home')
5. urls 연결하기
urlpatterns = [
path('question/', 문의뷰, name='question')
]
6.메일건
EMAIL_USE_TLS = True
EMAIL_HOST='smtp.mailgun.org'
EMAIL_HOST_USER='postmaster@mg.도메인.co' #도메인 등록한 경우
EMAIL_HOST_PASSWORD='1234'
EMAIL_PORT = 587
이글만 보기
[django toolBox] Gmail의 smtp를 백엔드로 이용하여 메일 보내기 contact form 만들기 (모델 이용)
[django toolBox] 는 장고 사용에 필요한 기능들을 군더더기 없이 짧고 간편하게 설명합니다.
django를 이용해 신청서나 폼메일등에서 Gmail의 smtp로 메일을 발송하는 방법을 소개합니다.
gmail의 보안수준을 낮게 설정하기
https://myaccount.google.com/lesssecureapps
settings.py 수정
EMAIL_HOST='smtp.gmail.com'
EMAIL_HOST_USER='123@gmail.com'
EMAIL_HOST_PASSWORD='123123123'
EMAIL_PORT = 587
이글만 보기
[django toolBox] 파이썬 장고(Django)와 MySQL 연동하기
[django toolBox] 는 장고 사용에 필요한 기능들을 군더더기 없이 짧고 간편하게 설명합니다.
- 파이썬 장고(Django)와 MySQL 연동하기
장고의 SQlite 은 파일 형식으로 간편하고 중소형 서비스까지 무난히 감당할 만한 강력한 DB입니다.
그러나 별도의 DB서버가 필요한 MySql을 신뢰하시는 분들도 많기에 장고에서 간단히 MySQL을 적용해 봅니다.
여기서는 SQlite에서 MySQL로 데이터를 이전 하는 부분은 설명하지 않고
초기 부터 MySQL을 사용하실 분이라는 것을 전제로 설명합니다.
또한 이미 MySQL 서버를 운영중이시라는 것을 전제로 합니다.
1.커넥트 설치
pip install mysqlclient
2.setting.py 작업
DATABASES = {
'default': {
#'ENGINE': 'django.db.backends.sqlite3',
#'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
'ENGINE': 'django.db.backends.mysql', #DB 종류
'NAME': 'shop2world', #연결할 MySQL 데이터베이스 이름
'USER': '샵투', # 해당 DB 접속 계정
'PASSWORD': '12345678910', #해당 접속 계정 비밀번호
'HOST': 'localhost', #My SQL 서버 주소
'PORT' : '3306', #포트명
}
}
3.마이그레잇
python manage.py makemigrations
python manage.py migrate
이글만 보기