๐ŸŒž ์ชฝ์ง€์‹œํ—˜

  1. ํ”„๋กœ์ ํŠธ์— ์‚ฌ์šฉ๋  ํด๋”๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ํŽธ์ง‘๊ธฐ(vscode, pycharm..)์—์„œ ์ƒ์„ฑํ•œ ํด๋”๋ฅผ ์—ด์–ด์ฃผ์„ธ์š”.
    mkdir sparta_django_test
  2. ํŒŒ์ด์ฌ ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ์ƒ์„ฑํ•˜๊ณ  ํ™œ์„ฑํ™”ํ•ด์ฃผ์„ธ์š”.
    python3 -m venv myvenv
    ls (ํ˜„์žฌ ๊ฒฝ๋กœ์— ์žˆ๋Š” ํŒŒ์ผ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ณด์—ฌ์ค€๋‹ค-> ์—ฌ๊ธฐ์— venv๊ฐ€ ์žˆ์–ด์•ผ ๊ฐ€์ƒํ™˜๊ฒฝ ํ™œ์„ฑํ™”(์•„๋ž˜ ์ฝ”๋“œ) ๊ฐ€๋Šฅ)
    source myvenv/bin/activate
    (<->deactivate)
  3. Django ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ด์ฃผ์„ธ์š”.
    pip install django
    pip freeze
    pip list
  4. spartatest๋ผ๋Š” django ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ด์ฃผ์„ธ์š”
    django-admin startproject spartatest
  5. customuser๋ผ๋Š” ์•ฑ์„ ์ƒ์„ฑํ•ด์ฃผ์„ธ์š”
    django-admin startapp customuser
  6. settings.py์— ์•ฑ์„ ๋“ฑ๋กํ•ด์ฃผ์„ธ์š”.
  7. Django์˜ User๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“  CustomModel๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด์ฃผ์„ธ์š”.
    ์กฐ๊ฑด: ํ…Œ์ด๋ธ” ์ด๋ฆ„์€ custom_user
    Django์˜ User ๋ชจ๋ธ์—์„œ ์•„๋ž˜์˜ ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ์„ธ์š”.
    - address (TextField, max_length=500, blank=True)
    - bio (TextField, max_length=500, blank=True)
    ํžŒํŠธ: class CustomModel(AbstractUser)
  8. Django์—๊ฒŒ ๊ธฐ๋ณธ ์ธ์ฆ๊ณผ์ • (AUTH_USER_MODEL)์„ customuser ์•ฑ์— ์ž‘์„ฑํ•œ CustomModel๋กœ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค! ๋ผ๊ณ  ์•Œ๋ ค์ฃผ์„ธ์š”.
    ํžŒํŠธ: settings.py
  9. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋ฐ˜์˜ํ•˜๊ณ  ์ ์šฉํ•ด์ฃผ์„ธ์š”.
    python3 manage.py makemigrations
    -> migration ํด๋” ์ƒ์„ฑ, db ๋ณ€๊ฒฝ์‚ฌํ•ญ ์ฒดํฌ, ํŒŒ์ผ๋กœ db table ์ƒ์„ฑ
    -> ์›๋ž˜ ์ฒ˜์Œ ๋งŒ๋“ค ๋• ํ•„์š” ์—†๋Š”๋ฐ ์ด๋ฒˆ์—” ์žฅ๊ณ ์—์„œ ์›๋ž˜ ์ œ๊ณตํ•˜๋Š” auth_user๋ชจ๋ธ์— ์ˆ˜์ •(๋‚ด๊ฐ€ ๋งŒ๋“  CustomModel์ถ”๊ฐ€) ์‚ฌํ•ญ์ด ์žˆ์–ด์„œ ํ•ด์ค˜์•ผํ•จ
    python3 manage.py migrate
    -> migrations ๋‚ด์šฉ์„ db์— ์ €์žฅ
  10. ๊ด€๋ฆฌ์ž ๊ณ„์ •์„ ๋งŒ๋“ค์–ด์ฃผ์„ธ์š”.
    python3 manage.py createsuperuser
  11. Admin ์‚ฌ์ดํŠธ์—์„œ CustomModel๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ์ ์šฉํ•ด์ฃผ์„ธ์š”.
    user/admin.py
    admin.site.register(CustomModels)
  12. ์„œ๋ฒ„๋ฅผ ์ผœ๊ณ  CustomModels์—์„œ ์•„๋ž˜์™€ ๊ฐ™์ด address์™€ bio๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์„ฑ๊ณต์ž…๋‹ˆ๋‹ค.
    python3 manage.py runserver

๐Ÿ‘ฝ ๊นƒ ํ„ฐ๋ฏธ๋„ ๋ณต์Šตํ•˜๊ธฐ

https://guides.codepath.com/ios/Using-Git-with-Terminal

๊นƒ ์‚ฌ์šฉํ•ด์„œ ๋ธŒ๋žœ์น˜ ๋งŒ๋“ค๊ณ  ํ‘ธ์‰ฌํ•ด๋ณด๊ธฐ( a7)

  1. ๊นƒ์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์€ ํด๋” ์•ˆ์œผ๋กœ ๋“ค์–ด๊ฐ€์„œ(cd) git init
  2. ํด๋” ์•ˆ์— ๊นƒํด๋” ์ƒ์„ฑ๋œ๊ฑฐ ํ™•์ธํ•˜๊ธฐ> command+shift+. ๋˜๋Š” ํ„ฐ๋ฏธ๋„์—์„œ ls
  3. ์›๊ฒฉ-๋กœ์ปฌ ์ €์žฅ์†Œ ์—ฐ๊ฒฐํ•˜๊ธฐ> git remote add origin (๋ธŒ๋žœ์น˜ ์ด๋ฆ„) https://github.com/1TEAM12/insta_clone.git (์›๊ฒฉ๋ฆฌํฌ ์ฃผ์†Œ)
  4. git branch -M main
  5. git pull origin main -f(๊ฐ•์ œ)
  6. ์ƒˆ๋กœ์šด ๋ธŒ๋žœ์น˜(hy)์ƒ์„ฑ> git branch hy
  7. ์ƒˆ๋กœ์šด ๋ธŒ๋žœ์น˜๋กœ ์ด๋™> git switch hy (=checkout hy)
    -> ์ƒˆ๋กœ์šด ๋ธŒ๋žœ์น˜ ์ƒ์„ฑํ•˜๊ณ  ์ฒดํฌ์•„์›ƒํ•˜๊ธฐ> git checkout -b hy
  8. ์ƒˆ๋กœ์šด ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ ํ™•์ธ/ ํ˜„์žฌ ๋ธŒ๋žœ์น˜ ํ™•์ธ> git branch
    -> ์›๊ฒฉ ๋ธŒ๋žœ์น˜ ํ™•์ธ> git branch -r ๋กœ์ปฌ, ์›๊ฒฉ ๋ธŒ๋žœ์น˜ ๋ชจ๋‘ ํ™•์ธ> git branch -a
  9. ์ƒˆ๋กœ์šด ํŒŒ์ผ ๋งŒ๋“ค๊ธฐ> touch a.txt(๋งŒ๋“ค๊ธฐ๋งŒ) ๋˜๋Š” vi a.txt(์—†์œผ๋ฉด ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด์ง)
  10. ๋กœ์ปฌ์—์„œ ํŒŒ์ผ ์Šคํ…Œ์ด์ง•ํ•˜๊ธฐ>git add a.txt
  11. ๋กœ์ปฌ์—์„œ ํŒŒ์ผ ์ปค๋ฐ‹ํ•˜๊ธฐ>git commit a.txt(๋‚ด์šฉ๊นŒ์ง€ ์ž‘์„ฑ)/git commit -m "๊ฐ„๋žตํ•œ ์ปค๋ฐ‹๋‚ด์šฉ"
    -> ์ถ”์ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ํŒŒ์ผ์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ ์ปค๋ฐ‹ํ•˜๊ธฐ> git commit -m "์ปค๋ฐ‹๋‚ด์šฉ"
  12. ๋ฉ”์ธ ๋ธŒ๋žœ์น˜๋กœ ๋จธ์ง€ํ•˜๊ธฐ> git checkout main ํ›„ git merge hy
  13. ์›๊ฒฉ๋ฆฌํฌ ๋ณ€๊ฒฝ๋‚ด์—ญ ๊ฐ€์ ธ์˜ค๊ธฐ> git pull/git pull origin main
  14. ์›๊ฒฉ๋ฆฌํฌ๋กœ ๋กœ์ปฌ๋ฆฌํฌ ๋ณ€๊ฒฝ๋‚ด์—ญ ํ‘ธ์‰ฌํ•˜๊ธฐ> git push origin main
  • git version> ๊นƒ ๋ฒ„์ „ ํ™•์ธ(branch๊ฐ€ main์ด ๋˜๋ ค๋ฉด v2.28 ์ด์ƒ)
  • ๊นƒ ์—…๋ฐ์ดํŠธ>

$ sudo add-apt-repository ppa:git-core/ppa -y
$ sudo apt-get update
$ sudo apt-get install git -y

  • password authentication ์˜ค๋ฅ˜>

Support for password authentication was removed on August 13, 2021. Please use a personal access token instead.

-> ํ„ฐ๋ฏธ๋„์—์„œ ์›๊ฒฉ๋ฆฌํฌ๋กœ ํ‘ธ์‰ฌ๋ฅผํ•˜๋Š”๋ฐ ๋กœ๊ทธ์ธ์„ ํ–ˆ๋”๋‹ˆ ๊ณ„์† ์˜ค๋ฅ˜๊ฐ€ ๋‚ฌ๋‹ค
ํŒจ์Šค์›Œ๋“œ ์ธ์ฆ๋ฐฉ์‹์ด ์•„๋‹ˆ๋ผ ํ† ํฐ/ssh์„ ๋งŒ๋“ค์–ด์„œ ์ธ์ฆํ•˜๋ฉด ๋”์ด์ƒ ๊ฒฝ๊ณ ์ฐฝ์ด ๋œจ์ง€ ์•Š๋Š”๋‹ค!

ํ† ํฐ ๋ฐœ๊ธ‰๋ฐ›๋Š” ๋ฐฉ๋ฒ•:
github settings -> developer settings -> personal access tokens -> generate new token -> repo, admin:repo_hook, gist, user, delete_repo ์ฒดํฌ โœ… -> โญ๏ธํ† ํฐ ๋ณต์‚ฌ(๋‹ค์‹œ ๋ชป๋ด„!)โญ๏ธ

  • ํ„ฐ๋ฏธ๋„ ํžˆ์Šคํ† ๋ฆฌ๋Š” history๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค

์ฐธ๊ณ ) https://medium.com/@joongwon/git-git-๋ช…๋ น์–ด-์ •๋ฆฌ-c25b421ecdbd


๐ŸฆŠ ์žฅ๊ณ ๊ธฐ์ดˆ 5์ฃผ์ฐจ ๋~~~!!!!!!

๐ŸŒต ๊ธ€์“ฐ๊ธฐ ๋ถ€๋ถ„ ์ˆ˜์ •(tweet)

  1. ์ž‘์„ฑํ•œ ๋‚ด์šฉ์ด ์—†์–ด๋„ ์ €์žฅ๋จ-> ์ž‘์„ฑํ•œ ๋‚ด์šฉ์ด ์žˆ์–ด์•ผ ์ €์žฅ๊ฐ€๋Šฅ
  • tweet/views.py
# tweet/views.py

@login_required # ๋กœ๊ทธ์ธํ•˜์ง€ ์•Š์œผ๋ฉด ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Œ
def tweet(request):
    if request.method == 'GET':  # ์š”์ฒญํ•˜๋Š” ๋ฐฉ์‹์ด GET ๋ฐฉ์‹์ธ์ง€ ํ™•์ธํ•˜๊ธฐ
        all_tweet = TweetModel.objects.all().order_by('-created_at')
        return render(request, 'tweet/home.html', {'tweet': all_tweet})
    elif request.method == 'POST':  # ์š”์ฒญ ๋ฐฉ์‹์ด POST ์ผ๋•Œ
        user = request.user  # ํ˜„์žฌ ๋กœ๊ทธ์ธ ํ•œ ์‚ฌ์šฉ์ž๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
        content = request.POST.get('my-content', '') #๊ธ€ ์ž‘์„ฑ์ด ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ๋นˆ์นธ์œผ๋กœ

        if content == '': # ๊ธ€์ด ๋นˆ์นธ์ด๋ฉด ๊ธฐ์กด tweet๊ณผ ์—๋Ÿฌ๋ฅผ ๊ฐ™์ด ์ถœ๋ ฅ
            all_tweet = TweetModel.objects.all().order_by('-created_at')
            return render(request, 'tweet/home.html', {'error': '๊ธ€์€ ๊ณต๋ฐฑ์ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค', 'tweet': all_tweet})
				else:
	        my_tweet = TweetModel.objects.create(author=user, content=content) # ๊ธ€ ์ €์žฅ์„ ํ•œ๋ฒˆ์—!
	        my_tweet.save()
	        return redirect('/tweet')
  • tweet/home.html
<form action="/tweet/" method="post">
  {% csrf_token %}
  {% if error %}
      <div class="alert alert-danger" role="alert">
          {{ error }}
      </div>
  {% endif %}
  1. ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐ”์˜ <์นœ๊ตฌ> ํƒญ์ด ๋กœ๊ทธ์ธํ•˜์ง€ ์•Š์•˜์„ ๋•Œ๋Š” ๋ณด์ด์ง€ ์•Š๋„๋กํ•˜๊ธฐ
  • base.html
{% if  user.is_authenticated %}
<div class="collapse navbar-collapse" id="navbarSupportedContent">
    <ul class="navbar-nav mr-auto">
        <li class="nav-item">
            <a class="nav-link" href="/user"> ์นœ๊ตฌ <span class="sr-only"></span></a>
        </li>
    </ul>
</div>
{% endif %}

-> ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐ”์˜ <์นœ๊ตฌ> ๋ถ€๋ถ„์„ ๋กœ๊ทธ์ธํ•œ ๊ฒฝ์šฐ๋กœ ๊ฐ์‹ธ์คŒ

๐ŸŒต django taggit

  • ํƒœ๊ทธ ๋ชจ๋“ˆ ์„ค์น˜

pip install django-taggit
pip install django-taggit-templatetags2
(preference์—์„œ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋กœ๋„ ์„ค์น˜๊ฐ€๋Šฅ)

  • settings.py์—์„œ ์ˆ˜์ •ํ•ด์ฃผ๊ธฐ
    -> installed_apps์— ์ถ”๊ฐ€

TAGGIT_CASE_INSENSITIVE = True
TAGGIT_LIMIT = 50

  • tweet/models.py
from taggit.managers import TaggableManager

class TweetModel(models.Model):
			...
 tags = TaggableManager(blank=True)

-> (blank=True)๋Š” ๋น„์–ด์žˆ์–ด๋„ ์ž‘๋™ํ•˜๊ฒ ๋‹จ ๋œป
-> ๋ชจ๋ธ์ด ๋ณ€๊ฒฝ๋˜์–ด์„œ makemigrations/migrate ํ•ด์„œ db์— ๋ฐ˜์˜์‹œ์ผœ์คŒ

  • tweet/views.py
elif request.method == 'POST':
			...
	 tags = request.POST.get('tag', '').split(',')
     else:
            my_tweet = TweetModel.objects.create(author=user, content=content)
            for tag in tags:
                tag = tag.strip() # ๊ณต๋ฐฑ์ œ๊ฑฐ
                if tag != '': # ํƒœ๊ทธ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ์— ์ €์žฅํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด์„œ
                    my_tweet.tags.add(tag)
            my_tweet.save() 
     

-> post๋ฐฉ์‹์ผ ๋•Œ ๋ฐ›๋Š” ๋ณ€์ˆ˜๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์œผ๋ฏ€๋กœ(tags) html์—์„œ ๋ฐ›์•„์™€์•ผํ•จ
-> tweet/home.html ์ˆ˜์ •

  • ์žฅ๊ณ  ๋„ํ๋จผํŠธ์—์„œ ๊ถŒ์žฅํ•˜๋Š” ์–‘์‹ ์ถ”๊ฐ€
# tweet/views.py(ํƒœ๊ทธํ•จ์ˆ˜์ถ”๊ฐ€)
from django.views.generic import ListView, TemplateView

### ์ค‘๊ฐ„ ์ƒ๋žต #############

class TagCloudTV(TemplateView):
    template_name = 'taggit/tag_cloud_view.html'

class TaggedObjectLV(ListView):
    template_name = 'taggit/tag_with_post.html'
    model = TweetModel

    def get_queryset(self):
        return TweetModel.objects.filter(tags__name=self.kwargs.get('tag'))

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['tagname'] = self.kwargs['tag']
        return context
# tweet/urls.py(url์ถ”๊ฐ€)
path('tag/', views.TagCloudTV.as_view(), name='tag_cloud'),
path('tag/<str:tag>/', views.TaggedObjectLV.as_view(), name='tagged_object_list'),
  • templates/taggit/tag_cloud_view.html, tag_with_post.html ์ถ”๊ฐ€

๐ŸŒต GitHub ์˜ฌ๋ฆฌ๊ธฐ

  • ์‚ฌ์ „์ž‘์—…: sqlite์‚ญ์ œ/ migrations ํด๋” init.py ๋นผ๊ณ  ์‚ญ์ œ/ myspartasns/settings.py ์ˆ˜์ •
  • github) create new repository
  • github์— ๋‚ด ํ”„๋กœ์ ํŠธ ์˜ฌ๋ฆฌ๊ธฐ(cli)

git init (๊นƒ๊ณผ ์—ฐ๋™ํ•˜๋Š” ํด๋”๋กœ ๋งŒ๋“ค๊ธฐ)
git add . (์ด ๊ฒฝ๋กœ์— ์žˆ๋Š” ํŒŒ์ผ ๋‹ค ์˜ฌ๋ฆผ)
git commit -m '์ปค๋ฐ‹๋‚ด์šฉ'
git branch -M main
git remote add origin https://github.com/hyojine/mySpartaSNS.git
git push -u origin main

๐ŸŒต aws ์„œ๋ฒ„ ๋“ฑ๋กํ•˜๊ณ (ec2 ip์ฃผ์†Œ์ƒ์„ฑ), gabia ๋„๋ฉ”์ธ ๋“ฑ๋กํ•˜๊ธฐ(์„ ํƒ)


๐Ÿ˜Ž ์ธ์Šคํƒ€ ํด๋ก ์ฝ”๋”ฉ ์œ ํŠœ๋ธŒ ๋ณด๊ธฐ

profile
looooggi

0๊ฐœ์˜ ๋Œ“๊ธ€

Powered by GraphCDN, the GraphQL CDN