Django 에어비앤비 클론 3부 (21.04.05 ~ 12.06)
#15 Sign Up
- forms.Form, forms.ModelForm [04/05]
form을 만드는 방법에는 여러가지가 있는데, 그 중에 두가지를 다뤄볼 수 있었다.
Form : 각각의 field를 내가 직접 정의한다.
ModelForm : 장고에서 정의해놓은 field를 잘 사용하면 된다. model이라는 이름이 붙은 이유는
class SignUpForm(forms.ModelForm):
class Meta:
model = models.User
fields = (
"first_name",
"last_name",
"email",
)
Meta SubClass를 통해서 fields를 정의해 줄 때, 앱 내의 model에 정의된 field를 그대로 사용할 수 있기 때문이다.
- mailgun.com [04/06]
: 이메일을 보내는 기능을 수행해준다. django내부에도 같은 기능이 있는데 (장고는 대부분의 기능을 가지고 있다.) 장고가 단독으로 수행할 경우에는 스팸처리가 되버리기 때문에, 일종의 인증기관을 거치는 거라고 보면 된다. 이 인증기관에서는 key와 password같은 정보를 공개하지 못하게 하는데, 이걸 실수로 git에 올려버렸고... 오늘 개발이 중단되었다.. (살려줘....) 리셋절차 밟고 문의했는데.. 내일을 기다려 봐야지..
전부 진행을 했고.. 음... 뭐 딱히 적을게 없던걸?... 그 뒤에 깃허브 로그인과 카카오 로그인을 구현했는데, 이는 전부 각 회사의 다큐먼트에 잘 나와있어서 따라한게 전부. 그럼 이제 스타일링
(너무 축약된 감이 있는 듯 하지만,,, 이는 전부 나의 귀찮음 때문)
#19 Intro to tailwindcss
스타일링을 도와주는 프레임은 여러가지가 있는데, 기존에 사용했던 부트스트랩은 너무 비슷비슷한 결과물들이 나온다는 느낌이 있었다. 반면 테일윈드는 아니라고 그러네?(니꼬샘 기준)
믿고 보는 니꼬쌤!
- Setting Up! [04/11]
: 세팅은 어렵지 않다. node.js, gulp.js, tailwind를 다운받으면 된다. 자세한건 노마드코더 아카데미의 gulp무료강의에 잘 나와있다. 이걸 수강하지 않아서그런지 하나도 모르겠더라..
- npm init
- package.json 파일에서 main, script, author, lisence 를 지워준다.
- npm i gulp gulp-postcss gulp-sass gulp-csso node-sass -D
: gulp, gulp-postcs, gulp-sass, gulp-csso, node-sass를 Developer모드로 다운받는다.
- npm install tailwindcss -D
- npx tailwindcss init
: tailwind.config.js 파일이 생성된다.
이후, ./gulp.js를 작성하고
- npm install autoprefixer
: css parsing을 위한 플러그인이다.
./package.json ./assets/scss/styles.scss 를 작성하고
(이 파일들을 작성하는 방법은 정확히 모르겠다. 이건 gulp에 대한 강의를 수강해야할듯)
gulpfile.js
const gulp = require("gulp");
const css = () => {
const postCSS = require("gulp-postcss");
const sass = require("gulp-sass");
const minify = require("gulp-csso");
sass.compiler = require("node-sass");
return gulp
.src("assets/scss/styles.scss")
.pipe(sass().on("error", sass.logError))
.pipe(postCSS([require("tailwindcss"), require("autoprefixer")]))
.pipe(minify())
.pipe(gulp.dest("static/css"));
};
exports.default = css;
강의에서 들을 수 있었던건 return 부분의 4개의 pipe인데,
첫번째 라인은, sas코드를 가져와서 css코드를 만들고, ---> sas가 뭔지 모름
두번째 라인은 tailwind 파일을 가져와서 real css로 만들어주고
세번째 라인이 minify. css파일의 용량을 축소시켜준 뒤,
네번째 라인에서 static/css 파일로 작성한다.
npm run css
터미널에서 위 명령어를 실행하면, static/css/styles.css 가 자동으로 생성된다. 이런식으로 스타일링을 진행한다.
프론트 작업을 위해 수정해야하는 파일은 scss 파일이고, 이 파일을 수정하고 나서는 npm run css 명령어를 실행해 css로 반영되도록 해야한다.
+) 에러 처리
다음과 같은 에러가 발생했다.
고정 플러그인이 지원되지 않아 발생한 문제로 보인다.
1. gulp.js 파일에서
const sass = require("gulp-sass"); 이 부분을
var sass = require('gulp-sass')(require('sass')); 이렇게 수정한다.
2. npm install --save-dev sass
일단 해보래서 했는데,, 이거 덕분에 작동했는지는 잘 모르겠다.
아무튼 오류를 해결했다.
- Static Files on Django [07/20]
장고에서 static파일에 접근할 수 있도록 설정한다.
settings.py
STATICFILES_DIRS = [os.path.join(BASE_DIR, "static")] 이 부분이 추가됐다.
STATIC_URL은 Django에서 static파일에 접근하는 url이라고 보면 되고, STATICFILES_DIR은 그 URL로 접근했을 때 보여질 파일들이라고 생각하면 된다. 주소와 파일을 설정하는 것이다.
그러면 template/base.html에서 다음과 같은 링크를 통해 스타일을 적용할 수 있다.
<link rel="stylesheet" href="{% static "css/styles.css" %}"/>
물론 최상단부에
{% load static %}
이부분을 추가해야한다.
그러면 스타일 코드를 적용할 수 있다.
#20 Make it beautiful [04/26]
ㅋㅋㅋㅋ 평일에는 챌린지 하느라 진도를 많이 못빼서, 주말에 몰아서 해야겠다는 생각을 2주 연속으로 했다. 근데 이거.... 한 챕터가 가지고 있는 양이 너무 방대해서 진짜 겨우 하나 끝낸 수준 ㅋㅋㅋㅋㅋ
점점 양이 많아진다. 그래도 67%성공... 이제 챌린지 하고 다른공부 하러 가자^^..
tailwind를 작성하는 방법은 딱히 메모할 생각이 없다. 일반적인 css를 작성하는 방법과 유사하기 때문인데, 모든 속성을 class로 작성한다는게 편리하다. (이전에 css 수업에서 언급됐던 적이 있다. class, id 등 한가지를 기준으로 놓고 스타일링을 해야한다고..) 뭐 더 다양한 커스터마이징은 더 공부를 해야겠지만 일단은 만족스러운 프레임워크이다.
- templates with variables.
템플릿을 작성할 때, include문법을 통해서 다른 템플릿과 연결할 때가 많다. 이 때 특정 변수들을 넘겨줘야한다면 with를 사용하도록 하자
{% include 'mixins/auth/form_input.html' with field=field %}
- Form.py with templates
템플릿을 편하게 만들 수 있도록 해주는 장치가 form.py 라는 것은 알고 있을 것이다. 두 파일의 상호작용을 잘 파악하고 있을 필요가 있다. 예를 들면
form.py
password = forms.CharField(
widget=forms.PasswordInput(attrs={"placeholder": "Password"})
)
이렇게 정의된 필드를 템플릿에서 {{form.field}} 형태로 호출할 수 있는데, 이 코드는
<input type="password" placeholder="Password"></input>
대충 이런? 구조로 작동하게 된다. 여러 다큐먼트를 참고하면서 작성하면, 굉장히 유용한 도구가 될 것 같다.
#21 USER PROFILE, EDIT PROFILE, CHANGE PASSWORD
어우.. 양이 너무많아..
- models.get_absolute_url(self):
이 함수는 정의된 모델로 만들어진 각각의 값들을 개별 페이지로 만들 때 유용하다. 특정 url+고유값(primary key) 형태로 url을 구성한다.
- interaction backend and frontend
프론트에 form을 이용해서 image를 업로드 하는 input을 만들었다. 문제는, 이 인풋을 사용해도 백앤드로 이미지가 전달되지 않는다는 점이다. 이는 인코딩 타입이 달라서 생기는 문제라고 하는데(니코쌤..) 나는 여전히 잘 모르겠다. 이걸 해결하는 방법은 frontend에서 form태그에 enctype="multipart/form-data" 옵션을 추가하는 것이다. 그러면 전달이 된다.
- mixins 믹스인
객체 지향 프로그래밍 언어에서 믹스인은 다른 클래스의 부모 클래스가 되지 않으면서 다른 클래스에서 사용할 수 있는 메서드를 포함하는 클래스.
메소드를 확장해서 사용하고 싶을 때, 상속 없이 사용할 수 있는 메서드를 말한다. 장고를 비롯한 여러 프레임워크에서 자주 사용하는 방식이다.
-- 12.06 다시 시작하기
#22 Room Detail
- html include 인자 전달
mixin 형태로 사용하는 html을 다른 html에서 사용하고 싶을 때 쓰는 방법이
{% include 'path/ .html' %}
인데, 이 뒤에 with를 통해서 인자를 전달할 수 있다.
{% include 'path/ .html' with uesr=user%}
근데 만약, 값이 입력되지 않을 경우 고정값(default value)을 갖고싶다면 스타일 코드에 이렇게 작성하면 된다.
<span class="{{text|default:'text-3xl'}}">{{user.first_name|first}}</span>
신기한 점 하나를 발견했다. default:뒤에 값을 넣을 때 딱 붙여서 넣어야한다. 한 칸의 공백을 만들 경우 2가지 value를 받아야 한다고 인식하더라... (이거 찾는데 5분걸림 하하)
-