๋ณธ ํ”„๋กœ์ ํŠธ๋Š” ํŒจ์บ  ๊ฐ•์˜๋ฅผ ์ฐธ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

<์ด์ „ ๊ธ€>

https://silvercoding.tistory.com/16

 

[DJANGO ๊ธฐ์ดˆ] 6. ์„ธ์…˜, ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ ๊ตฌํ˜„

๋ณธ ํ”„๋กœ์ ํŠธ๋Š” ํŒจ์บ  ๊ฐ•์˜๋ฅผ ์ฐธ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. <์ด์ „ ๊ธ€> https://silvercoding.tistory.com/15 https://silvercoding.tistory.com/14 https://silvercoding.tistory.com/13 https://silvercoding.tistory.com/12 htt..

silvercoding.tistory.com

 

์ด์ „ ๊ธ€๊นŒ์ง€ ํšŒ์›๊ฐ€์ž…๊ณผ ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค์—ˆ๋Š”๋ฐ, ๋‘๊ฐœ์˜ template html์ด ๊ฑฐ์˜ ์œ ์‚ฌํ–ˆ๋‹ค. ์ด๋ฒˆ ๊ธ€์—์„œ ์ด๋ ‡๊ฒŒ ๊ฒน์น˜๋Š” html์„ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ๊ฐ„๋‹จํžˆ ์ƒ์†๋ฐ›๋Š” ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด๋ณธ๋‹ค. 

 

 

 

1. ๊ธฐ๋ณธ์ด ๋˜๋Š” html ํŒŒ์ผ ์ƒ์„ฑ 

community ---> user ---> templates ---> base.html ์ƒ์„ฑ 

<html>

<head>

    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <!-- <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-+0n0xVW2eSR5OomGNYDnhzAbDsOXxcvSN1TPprVMTNDbiYZCxYbOOl7+AMvyTG2x" crossorigin="anonymous"> -->
    <link rel="stylesheet" href="/static/bootstrap.min.css" />
    <script src="https://cdn.jsdelivr.net/npms/bootstrap@5.0.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-gtEjrD/SeCtmISkJkNUaaKMoLD0//ElJ19smozuHV6z3Iehds+3Ulb9Bn9Plx0x4" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js" integrity="sha384-IQsoLXl5PILFhosVNubq5LC7Qb9DXgDA9i+tQ8Zj3iwWAwPtgFTxbJ8NT4GN1R8p" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/js/bootstrap.min.js" integrity="sha384-Atwg2Pkwv9vp0ygtn1JAojH0nYbwNJLPhwyoVbhoPwBhjQPR5VtM2+xf0Uwh9KtT" crossorigin="anonymous"></script>
</head>

<body>
    <div class="container">
        {% block contents %}
        {% endblock %}
    </div>
</body>

</html>

body๋ถ€๋ถ„์˜ container ๊นŒ์ง€๋งŒ ๋‚จ๊ฒจ๋‘๊ณ , 

{% block contents %} {% endblock %} ๋ฅผ ์ž‘์„ฑํ•ด์ค€๋‹ค. 

 

์ด ์‚ฌ์ด์— ๋‹ค๋ฅธ ํŒŒ์ผ์—์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

 

 

2. ์ƒ์†๋ฐ›๊ธฐ 

community ---> user ---> templates ---> login.html

{% extends "base.html" %} 
{% block contents %}
<div class="row mt-5">
    <div class="col-12 text-center">
        <h1>๋กœ๊ทธ์ธ</h1>
    </div>
</div>
<div class="row mt-5">
    <div class="col-12">
        {{ error }}
    </div>
</div>
<div class="row mt-5">
    <div class="col-12">
        <form method="POST" , action=".">
            {% csrf_token %}
            <div class="form-group mb-3">
                <label for="username" class="form-label">์‚ฌ์šฉ์ž ์ด๋ฆ„</label>
                <input type="text" class="form-control" id="username" placeholder="์‚ฌ์šฉ์ž ์ด๋ฆ„" name="username">
            </div>
            <div class="form group mb-3">
                <label for="password" class="form-label">๋น„๋ฐ€๋ฒˆํ˜ธ</label>
                <input type="password" class="form-control" id="password" placeholder="๋น„๋ฐ€๋ฒˆํ˜ธ" name="password">
            </div>
            <button type="submit" class="btn btn-primary">๋กœ๊ทธ์ธ</button>
        </form>
    </div>
</div>
{% endblock %}

์šฐ์„  {% extends "base.html" %} ๋ฅผ ๊ฐ€์žฅ ์ƒ๋‹จ์— ์ž‘์„ฑํ•ด์ค€๋‹ค. 

๊ทธ๋‹ค์Œ ์ง€์ •ํ•˜๋Š” ๋ถ€๋ถ„์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก base.html์—์„œ ์ž‘์„ฑํ•œ ๊ฒƒ๊ณผ ๋™์ผํ•˜๊ฒŒ ์ž…๋ ฅํ•ด์ฃผ๋ฉด ๋œ๋‹ค. 

 

์„œ๋ฒ„์— ์ ‘์†ํ•˜์—ฌ ํ™•์ธํ–ˆ์„ ๋•Œ ์ „๊ณผ ๊ฐ™์ด ์ž˜ ๋™์ž‘ํ•œ๋‹ค๋ฉด ์„ฑ๊ณต! 

 

 

 

 

 

๋ณธ ํ”„๋กœ์ ํŠธ๋Š” ํŒจ์บ  ๊ฐ•์˜๋ฅผ ์ฐธ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

<์ด์ „ ๊ธ€>

https://silvercoding.tistory.com/15

 

[DJANGO ๊ธฐ์ดˆ] 5. Static ํŒŒ์ผ ๊ด€๋ฆฌ, ๋ถ€ํŠธ์ŠคํŠธ๋žฉ CSS ํ…Œ๋งˆ ์ ์šฉ

๋ณธ ํ”„๋กœ์ ํŠธ๋Š” ํŒจ์บ  ๊ฐ•์˜๋ฅผ ์ฐธ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. <์ด์ „ ๊ธ€> https://silvercoding.tistory.com/14 https://silvercoding.tistory.com/13 https://silvercoding.tistory.com/12 https://silvercoding.tistory.com/11 [D..

silvercoding.tistory.com

 

 

์„ธ์…˜ 

ํด๋ผ์ด์–ธํŠธ <------------------> ์„œ๋ฒ„ 

ํด๋ผ์ด์–ธํŠธ ์•ˆ์— ์ฟ ํ‚ค๊ฐ€ ๋“ค์–ด์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ฟ ํ‚ค๋Š” ์ €์žฅ์†Œ์™€ ๊ฐ™๋‹ค.  ์›น ๋ธŒ๋ผ์šฐ์ € ์•ˆ์— ์ฟ ํ‚ค๋ผ๋Š” ์ €์žฅ๊ณต๊ฐ„์ด ์žˆ๋Š”๋ฐ ์ด ์ €์žฅ๊ณต๊ฐ„์„ ํ™œ์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. 

 

๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ผœ์„œ ์„œ๋ฒ„์— ์š”์ฒญ์„ํ•˜๊ณ , ์‘๋‹ต์„ ๋ฐ›๋Š”๋‹ค. ์„œ๋ฒ„์—์„œ๋Š” ํ—ค๋”์— ์ฟ ํ‚ค ์ •๋ณด๋ฅผ ๋„ฃ์–ด์„œ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „๋‹ฌํ•œ๋‹ค.  ํด๋ผ์ด์–ธํŠธ๋Š” ๊ทธ ์ •๋ณด๋ฅผ ์ฟ ํ‚ค์— ์ €์žฅํ•œ๋‹ค. 

 

์„œ๋ฒ„ ์•ˆ์—์„œ๋Š” ์ฟ ํ‚ค๋กœ ์‚ฌ์šฉํ•  ํ‚ค๋ฅผ ๋งŒ๋“ ๋‹ค. ์ด๊ฑธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ์— ์•Œ๋ ค์ค€๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ์ž๊ธฐ ์ฟ ํ‚ค ์ €์žฅ์†Œ์— ์ €์žฅํ•œ๋‹ค. ์›น์‚ฌ์ดํŠธ ๋ณ„๋กœ ๋‚˜๋ˆ„์–ด์„œ ์ €์žฅํ•˜๊ฒŒ ๋œ๋‹ค.  

 

 ์ด์ •๋ฆฌ --->  1. (ํด๋ผ์ด์–ธํŠธ) ์‚ฌ์ดํŠธ์— ๋“ค์–ด๊ฐ€๋ฉด ์„œ๋ฒ„์— ์š”์ฒญ

2. (์„œ๋ฒ„) ์„œ๋ฒ„ ์•ˆ์—์„œ๋Š” ์ƒˆ๋กœ์šด ํ‚ค๋ฅผ ์ƒ์„ฑํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋„ฃ์€ ํ›„, ๊ทธ ํ‚ค๋ฅผ ํด๋ผ์ด์–ธํŠธ์— ์ „๋‹ฌํ•œ๋‹ค. 

3. (ํด๋ผ์ด์–ธํŠธ) ํด๋ผ์ด์–ธํŠธ๋Š” ๊ฐ๊ฐ์˜ ์›น์‚ฌ์ดํŠธ์— ํ•ด๋‹นํ•˜๋Š” ํ‚ค๋ฅผ ์ฟ ํ‚ค์— ์ €์žฅํ•œ๋‹ค.

4. (ํด๋ผ์ด์–ธํŠธ) ๋‹ค์Œ๋ถ€ํ„ฐ ์›น์‚ฌ์ดํŠธ์— ๋“ค์–ด๊ฐ€๋ฉด ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•˜๋Š” ๋ชจ๋“  ์š”์ฒญ์— ์ด ์ฟ ํ‚ค๋ฅผ ๊ฐ™์ด ๋ณด๋‚ธ๋‹ค.

5. (์„œ๋ฒ„) ๊ทธ๋Ÿผ ์„œ๋ฒ„๋Š” ๊ทธ ์ฟ ํ‚ค์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊บผ๋‚ด์™€์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. 

 

์–ด๋ ต๊ณ  ๋ณต์žกํ•ด๋ณด์ธ๋‹ค. ํ•˜์ง€๋งŒ ์žฅ๊ณ ์—์„œ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ต‰์žฅํžˆ ์‰ฌ์›Œ๋ณด์ธ๋‹ค.

 

 

 

 

๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ ๊ตฌํ˜„

1. Template ์ž‘์„ฑ 

templates ---> login.html  ํŒŒ์ผ ์ƒ์„ฑ 

ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€์™€ ๋น„์Šทํ•œ ๊ตฌ์„ฑ์ด๋ฏ€๋กœ register.html  ์„ ๋ณต๋ถ™ํ•ด์™€์„œ ์ˆ˜์ •์„ ์กฐ๊ธˆ ํ•ด์ค€๋‹ค. 

<html>

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <link rel="stylesheet" href="/static/bootstrap.min.css" />
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-gtEjrD/SeCtmISkJkNUaaKMoLD0//ElJ19smozuHV6z3Iehds+3Ulb9Bn9Plx0x4" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js" integrity="sha384-IQsoLXl5PILFhosVNubq5LC7Qb9DXgDA9i+tQ8Zj3iwWAwPtgFTxbJ8NT4GN1R8p" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/js/bootstrap.min.js" integrity="sha384-Atwg2Pkwv9vp0ygtn1JAojH0nYbwNJLPhwyoVbhoPwBhjQPR5VtM2+xf0Uwh9KtT" crossorigin="anonymous"></script>
</head>

<body>
    <div class="container">
        <div class="row-mt5">
            <div class="col-12 text-center">
                <h1>๋กœ๊ทธ์ธ</h1>
            </div>
        </div>
        <div class="row mt-5">
            <div class="col-12">
                {{error}}
            </div>
        </div>
        <div class="row mt-5">
            <form method="POST" action=".">
                {% csrf_token %}
                <div class="form-group mb-3">
                    <label for="username" class="form-label">์‚ฌ์šฉ์ž ์ด๋ฆ„</label>
                    <input type="text" class="form-control" id="username" placeholder="์‚ฌ์šฉ์ž ์ด๋ฆ„" name="username">
                </div>
                <div class="form-group mb-3">
                    <label for="password" class="form-label">๋น„๋ฐ€๋ฒˆํ˜ธ</label>
                    <input type="password" class="form-control" id="password" placeholder="๋น„๋ฐ€๋ฒˆํ˜ธ" name="password">
                </div>
                <button type="submit" class="btn btn-primary">๋กœ๊ทธ์ธ</button>
            </form>
        </div>
    </div>

</body>

</html>

์‚ฌ์šฉ์ž ์ด๋ฆ„, ๋น„๋ฐ€๋ฒˆํ˜ธ๋งŒ ๋‚จ๊ฒจ๋†“๋Š”๋‹ค. 

 

 

 

 

 

 

2. View ์ž‘์„ฑ

community ---> user ---> views.py 

login ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑ ํ•ด์ค€๋‹ค. 

def login(request):
    return render(request, 'login.html')

์šฐ์„  login.html ๊ณผ ์—ฐ๊ฒฐํ•ด์ฃผ์—ˆ๋‹ค. 

 

 

 

 

 

3. Url ์—ฐ๊ฒฐ 

community ---> user ---> urls.py

urlpatterns = [
	...
    path('login/', views.login),
]

์–ด๋–ค ์ฃผ์†Œ๋ฅผ ์—ฐ๊ฒฐํ–ˆ์„ ๋•Œ ์œ„์—์„œ ๋งŒ๋“  view๋ฅผ ์—ฐ๊ฒฐํ•ด ์ค„๊ฑด์ง€ ์ž‘์„ฑํ•˜๋Š” ์ฝ”๋“œ์ด๋‹ค. ์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•˜๋ฉด .../user/login/ ์ด๋ผ๋Š” ์ฃผ์†Œ๋ฅผ ์น˜๋ฉด ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ๋“ค์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค. 

 

 

์šฐ์„  ์—ฌ๊ธฐ๊นŒ์ง€ ํ•ด์„œ ํ™•์ธํ•ด๋ณด์ž. 

ํ•ด๋‹น ์ฃผ์†Œ์— ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ๋‹ค. 

 

 

 

 

 

4. ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ ์ž‘์„ฑ 

--- check password 

community ---> user ---> views.py 

check_password importํ•ด์„œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํ™•์ธํ•ด์ค€๋‹ค. 

def login(request):
    if request.method == 'GET':
        return render(request, 'login.html')
    elif request.method == 'POST':
        username = request.POST.get('username', None)
        password = request.POST.get('password', None)

        res_data = {}
        if not (username and password):
            res_data['error'] = "๋ชจ๋“  ๊ฐ’์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”."
        else:
            fcuser = User.objects.get(username = username)
            if check_password(password, fcuser.password):
                pass
            
            else: 
                res_data['error'] = "๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ํ‹€๋ ธ์Šต๋‹ˆ๋‹ค."

        return render(request, 'login.html', res_data)

๊ฐ’์„ ๋ชจ๋‘ ์ž…๋ ฅํ•˜์ง€ ์•Š๊ฑฐ๋‚˜, ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํ‹€๋ฆฌ๊ฒŒ ์ž…๋ ฅํ–ˆ์„ ๊ฒฝ์šฐ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ๋„์šด๋‹ค. 

๋กœ๊ทธ์ธ์— ์„ฑ๊ณตํ–ˆ์„ ๋•Œ๋Š” ์šฐ์„  pass๋กœ ๋‚จ๊ฒจ๋†“๊ณ  ํ™•์ธ์„ ํ•ด๋ณด์ž. 

 

 

์‹คํ—˜์„ ํ•ด๋ณด๋‹ˆ ๋ชจ๋‘ ์ž˜ ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. 

 

 

 

--- Session ํ™œ์šฉํ•˜์—ฌ ๋กœ๊ทธ์ธ 

๊ทธ๋‹ค์Œ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ผ์น˜ํ–ˆ์„ ๋•Œ์˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์ค€๋‹ค. ์—ฌ๊ธฐ์„œ ์„ธ์…˜์„ ํ™œ์šฉํ•œ๋‹ค.

community ---> user ---> views.py

 ...
 if check_password(password, fcuser.password):
                request.session['user'] = user.id 
                
                return redirect('/')
 ...

์ „ ์ฝ”๋“œ์—์„œ pass๋ถ€๋ถ„๋งŒ ๊ณ ์ณ์ค€๋‹ค. ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์ผ์น˜ํ•˜๋ฉด ๋กœ๊ทธ์ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ๋Š” ์ฝ”๋“œ์ด๋‹ค. request.session์€ ๋”•์…”๋„ˆ๋ฆฌ ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. user๋ผ๋Š” key์— user์˜ id ๊ฐ’์„ ๋„ฃ์–ด ์ฃผ๊ณ , ํŽ˜์ด์ง€์˜ ํ™ˆํ™”๋ฉด์œผ๋กœ ๊ฐ€๋Š” ์ฝ”๋“œ redirect('/')๋ฅผ ์ž‘์„ฑํ•ด ์ฃผ์—ˆ๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ ๋กœ๊ทธ์ธ์ด ๋˜๋Š” ๊ณผ์ •์€ ๋ณต์žกํ•ด๋ณด์˜€์ง€๋งŒ, ์žฅ๊ณ ๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์ด๋ ‡๊ฒŒ ๋ฐ์ดํ„ฐ ์ €์žฅ๋งŒ ํ•ด์ฃผ๋ฉด ์•Œ์•„์„œ ์ฒ˜๋ฆฌ๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํŽธ๋ฆฌํ•˜๋‹ค. 

 

 

 

community ---> user ---> views.py

home ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด์ค€๋‹ค. 

def home(request):
    user_id = request.session.get('user')
    if user_id:
        user = User.objects.get(pk=user_id)
        return HttpResponse(user.username + "๋‹˜ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!")

    return HttpResponse("Home!")

session์—์„œ ์ €์žฅํ•ด๋‘์—ˆ๋˜ user key๋ฅผ ๋ฐ›์•„์™€ user_id์— ์ €์žฅํ•ด์ฃผ๊ณ , ๊ทธ์— ํ•ด๋‹นํ•˜๋Š” User๋ชจ๋ธ ๊ฐ์ฒด๋ฅผ user์— ์ €์žฅํ•œ๋‹ค. h๋กœ๊ทธ์ธ์— ์„ฑ๊ณตํ•œ๋‹ค๋ฉด ๊ทธ user์˜ username์„ HttpResponse๋กœ ๋„์›Œ์ฃผ๋Š” ์ฝ”๋“œ์ด๋‹ค. 

 

 

 

 

community ---> urls.py 

์ด๋ฒˆ์—” user์•ˆ์˜ url์ด ์•„๋‹Œ community ์•ˆ์˜ url ํŒŒ์ผ์„ ์—ด์–ด์ค€๋‹ค.

urlpatterns = [
   ...
    path('', home)
]

url์— ์•„๋ฌด๊ฒƒ๋„ ๋ถ™์ด์ง€ ์•Š์•˜์„ ๋•Œ home ๋ทฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ฝ”๋“œ๊นŒ์ง€ ๋งˆ์ณค๋‹ค. ํ™•์ธํ•ด๋ณด์ž!

 

๊ทธ๋ƒฅ ์„œ๋ฒ„์— ๋“ค์–ด๊ฐ€๋ฉด Home!, ๋กœ๊ทธ์ธ์„ ํ•˜๋ฉด username์ด ์ž˜ ๋„์›Œ์ง„๋‹ค. 

 

 

 

 

*** ๋‚ด๋ถ€์ ์œผ๋กœ๋Š”

๊ฐœ๋ฐœ์ž๋„๊ตฌ(F12) ๋ฅผ ํ‚ค๋ฉด application ํƒญ ---> cookie ---> sessionid ---> ํ•˜๋‚˜์˜ ์‹๋ณ„์ž ๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๋‹ค.

์›นํŽ˜์ด์ง€๊ฐ€ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ์‹๋ณ„์ž์ธ ๊ฒƒ์ด๋‹ค. 

 

 

 

 

 

๊ฐ„๋‹จํ•œ ๋กœ๊ทธ์•„์›ƒ ๊ตฌํ˜„ 

community ---> user ---> view.py 

logout ํ•จ์ˆ˜ ์ž‘์„ฑ 

def logout(request):
    if request.session.get('user'):
        del (request.session['user'])

    return redirect('/')

๊ฐ„๋‹จํ•˜๊ฒŒ ์„ธ์…˜์— user ํ‚ค๊ฐ’์ด ์ €์žฅ๋˜์–ด ์žˆ์œผ๋ฉด ๊ทธ๊ฒƒ์„ ์ง€์šฐ๋Š” ์ฝ”๋“œ์ด๋‹ค. 

 

 

user ---> urls.py 

์•„์ง ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ url์— logout ์„ ์น˜๋ฉด ๋กœ๊ทธ์•„์›ƒ ๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์จ์ค€๋‹ค. 

urlpatterns = [
	...
    path('logout/', views.logout),
]

์ด์ œ .../user/logout ์ด๋ผ๊ณ  ์น˜๋ฉด ๋กœ๊ทธ์•„์›ƒ์ด ๋˜๊ณ  ํ™ˆํ™”๋ฉด์œผ๋กœ ๋Œ์•„๊ฐ€๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค. 

 

 

๊ฒฐ๊ณผ

 

 

๋กœ๊ทธ์ธ์ด ๋œ ์ฑ„๋กœ logout ์ฃผ์†Œ๋ฅผ ์ณค๋”๋‹ˆ ์„ฑ๊ณตํ–ˆ๋‹ค! 

 

๋ณธ ํ”„๋กœ์ ํŠธ๋Š” ํŒจ์บ  ๊ฐ•์˜๋ฅผ ์ฐธ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

<์ด์ „ ๊ธ€>

https://silvercoding.tistory.com/14

 

[DJANGO ๊ธฐ์ดˆ] 4. ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€ ๋งŒ๋“ค๊ธฐ (MTV ๊ตฌ์กฐ - T, V ์ž‘์„ฑ)

๋ณธ ํ”„๋กœ์ ํŠธ๋Š” ํŒจ์บ  ๊ฐ•์˜๋ฅผ ์ฐธ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. <์ด์ „ ๊ธ€> https://silvercoding.tistory.com/13 https://silvercoding.tistory.com/12 https://silvercoding.tistory.com/11 [DJANGO ๊ธฐ์ดˆ] ๊ฐ€์ƒํ™˜๊ฒฝ ์„ค์ • ๋ฐ ์•ฑ ์ƒ์„ฑ..

silvercoding.tistory.com

 

 

CDN 

๋ถ€ํŠธ์ŠคํŠธ๋žฉ CDN์€ Content Delivery Network์˜ ์•ฝ์ž๋กœ, ์™ธ๋ถ€์— ์žˆ๋Š” CSS๋˜๋Š” Javascript์ฃผ์†Œ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ์„œ๋น„์Šค์ด๋‹ค. 

 

๊ฐ„๋žตํ•œ ๊ฐœ๋…์„ ๋ณด๊ณ  ๋„˜์–ด๊ฐ€๋„๋ก ํ•˜์ž. CSS๋‚˜ Javascript์™€ ๊ฐ™์€ ํŒŒ์ผ์ด ์›๋ณธ ์„œ๋ฒ„์— ๋“ค์–ด๊ฐ€์žˆ๊ณ  ์—ฌ๋Ÿฌ๊ฐœ์˜ ์„œ๋ฒ„๋กœ ๋ถ„์‚ฐ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. ๋งŒ์•ฝ ์šฐ๋ฆฌ๋‚˜๋ผ์—์„œ ๊ธ€๋กœ๋ฒŒ ์„œ๋น„์Šค๋ฅผ ํ•˜๊ฒŒ ๋˜๋ฉด ์„œ๋ฒ„๊ฐ€ ํ•œ๊ตญ์— ์žˆ๊ฒŒ ๋˜๊ณ , ๊ทธ๋Ÿผ ์›๋ณธ์ด ํ•œ๊ตญ์— ์žˆ๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด ๋ฏธ๊ตญ์— ์žˆ๋Š” ์‚ฌ์šฉ์ž๋Š” ๋ฉ€๋ฆฌ ์žˆ๋Š” ์„œ๋ฒ„ ํƒ“์— ๋А๋ฆฐ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณต๋ฐ›๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ž˜์„œ ์ค‘๊ฐ„์— ์—ฌ๋Ÿฌ ์„œ๋ฒ„๋“ค์„ ๋‘๋Š” ๊ฒƒ์ด๋‹ค. ๋‚˜๋ผ๋ณ„๋กœ ์„œ๋ฒ„๋ฅผ ๋ฟŒ๋ ค๋†“๋Š” ๊ฒƒ์ด๋‹ค. ์ด์ฒ˜๋Ÿผ ์ž์‹ ์—๊ฒŒ ๋น ๋ฅธ ๊ณณ์œผ๋กœ ์ ‘์†ํ•ด์„œ ๋ฐ›์•„๊ฐ€๋Š” ์„œ๋น„์Šค๊ฐ€ CDN ์ด๋‹ค. 

 

 

๋ณธ ํ”„๋กœ์ ํŠธ์—์„œ ์“ฐ์ธ CSS ๋งํฌ๋„ ์›๋ณธ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ ๊ฒŒ ์•„๋‹ˆ๋ผ ํ˜„์žฌ pc์—์„œ ๊ฐ€์žฅ ๋น ๋ฅธ ์„œ๋ฒ„์—์„œ ๊ฐ€์ ธ์˜จ ๊ฒƒ์ด๋‹ค. 

 

 

(๋” ์ž์„ธํžˆ ์•Œ์•„๋ณด๋ ค๋ฉด)

CDN ์ฐธ๊ณ  ๋ฌธ์„œ 

https://docs.microsoft.com/ko-kr/azure/cdn/cdn-overview

 

CDN(์ฝ˜ํ…์ธ  ๋ฐฐ๋‹ฌ ๋„คํŠธ์›Œํฌ)์ด๋ž€? - Azure

Azure CDN(Content Delivery Network) ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋ณด๊ณ  ๊ณ ๋Œ€์—ญํญ ์ฝ˜ํ…์ธ ๋ฅผ ๋ฐฐ๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ด…๋‹ˆ๋‹ค.

docs.microsoft.com

 

๊ธฐ์กด์— ์ด๋Ÿฌํ•œ CDN์„ ์‚ฌ์šฉํ•˜์—ฌ CSS๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค. ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” CDN์„ ์“ฐ์ง€ ์•Š์œผ๋ฉด์„œ CSS๋ฅผ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณผ ๊ฒƒ์ด๋‹ค. 

 

 

 

 

์ง์ ‘ ๋งŒ๋“  CSS ํŒŒ์ผ์„ ์ ์šฉํ•˜๋ ค๋ฉด  

1. static ํด๋” ๋งŒ๋“ค๊ธฐ 

community ---> static ํด๋” ์ƒ์„ฑ

์ƒ์„ฑํ•œ static ํด๋”์—์„œ css, javascript ํŒŒ์ผ ๊ด€๋ฆฌ๋ฅผ ํ•˜๊ฒŒ๋œ๋‹ค.

 

settings.py 

...
import os

...

STATIC_URL = '/static/'
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static')
]

...

์ด๋ฏธ STATIC_URL ์ž‘์„ฑ๋˜์–ด์žˆ๋‹ค. ์ด์ œ cssํŒŒ์ผ์— ์ ‘๊ทผํ–ˆ์„ ๋•Œ ๊ทธ๊ฒŒ ์–ด๋””ํŒŒ์ผ์— ์žˆ๋Š”์ง€๋ฅผ ์•Œ๋ ค์ฃผ์–ด์•ผ ํ•œ๋‹ค. 

STATICFILES_DIRS = [] ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด ํด๋”๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค. BASE_DIR ๋Š” ํ”„๋กœ์ ํŠธ ํด๋”์ธ community์ด๊ณ , ์ƒ์„ฑํ•œ static ํด๋”์™€ joinํ•ด์ค€๋‹ค. os๋ฅผ importํ•˜๋Š” ๊ฒƒ๋„ ์žŠ์ง€ ๋ง์ž.

 

 

 

 

 

2. CSS ํŒŒ์ผ ์ค€๋น„

๋ฐฑ์—”๋“œ ์ค‘์‹ฌ์˜ ํ”„๋กœ์ ํŠธ์ด๋ฏ€๋กœ ์ง์ ‘ CSS ํŒŒ์ผ์„ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ๋ถ€ํŠธ์ŠคํŠธ๋žฉ์˜ ํ…Œ๋งˆ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค. 

 

 

<bootstrap 4.3 themes free>

https://bootswatch.com/

 

Bootswatch: Free themes for Bootstrap

Customizable Changes are contained in just two SASS files, enabling further customization and ensuring forward compatibility.

bootswatch.com

์ด๊ณณ์—์„œ ๋งˆ์Œ์— ๋“œ๋Š” ํ…Œ๋งˆ๋ฅผ ๊ณจ๋ผ์„œ 

bootstrap.min.css ๋ฅผ ๋‹ค์šด๋ฐ›์•„์ค€๋‹ค. 

 

๋‹ค์šด๋ฐ›์€ ํŒŒ์ผ์„ staticํด๋”์— ์˜ฎ๊ฒจ์ค€๋‹ค. 

 

 

 

์ด์ œ ๋ชจ๋“  ์ค€๋น„๋ฅผ ๋งˆ์ณค๊ณ , html์— ์ ์šฉํ•ด์ค€ ๋‹ค์Œ ๊ฒฐ๊ณผ ํ™•์ธ์„ ํ•ด๋ณธ๋‹ค.

 

 

3. html์— CSS ์ ์šฉํ•ด์ฃผ๊ธฐ

user ---> templates --->  register.html

 

์›๋ž˜ ์ฝ”๋“œ

...

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-+0n0xVW2eSR5OomGNYDnhzAbDsOXxcvSN1TPprVMTNDbiYZCxYbOOl7+AMvyTG2x" crossorigin="anonymous">
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-gtEjrD/SeCtmISkJkNUaaKMoLD0//ElJ19smozuHV6z3Iehds+3Ulb9Bn9Plx0x4" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js" integrity="sha384-IQsoLXl5PILFhosVNubq5LC7Qb9DXgDA9i+tQ8Zj3iwWAwPtgFTxbJ8NT4GN1R8p" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/js/bootstrap.min.js" integrity="sha384-Atwg2Pkwv9vp0ygtn1JAojH0nYbwNJLPhwyoVbhoPwBhjQPR5VtM2+xf0Uwh9KtT" crossorigin="anonymous"></script>
</head>

...

 

 

CSS ํ…Œ๋งˆ ์ ์šฉ ์ฝ”๋“œ

...

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <link rel="stylesheet" href="/static/bootstrap.min.css" />
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-gtEjrD/SeCtmISkJkNUaaKMoLD0//ElJ19smozuHV6z3Iehds+3Ulb9Bn9Plx0x4" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js" integrity="sha384-IQsoLXl5PILFhosVNubq5LC7Qb9DXgDA9i+tQ8Zj3iwWAwPtgFTxbJ8NT4GN1R8p" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/js/bootstrap.min.js" integrity="sha384-Atwg2Pkwv9vp0ygtn1JAojH0nYbwNJLPhwyoVbhoPwBhjQPR5VtM2+xf0Uwh9KtT" crossorigin="anonymous"></script>
</head>

...

link ํƒœ๊ทธ๋งŒ ๋ฐ”๊พผ๋‹ค. static ํด๋”์˜ css ํŒŒ์ผ์„ ์—ฐ๊ฒฐ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค. 

 

 

๋ชจ๋‘ ๋งˆ์นœ ํ›„ ์„œ๋ฒ„์— ๋“ค์–ด๊ฐ€๋ณด๋ฉด ์ด๋ ‡๊ฒŒ ํ™”๋ คํ•œ ํ…Œ๋งˆ๊ฐ€ ์ ์šฉ์ด ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค!

 

 

 

๋‹ค์Œ ๊ธ€์—์„œ๋Š” ์„ธ์…˜ ๋ฐ ๋กœ๊ทธ์ธ์„ ์•Œ์•„ ๋ณด๋„๋ก ํ•œ๋‹ค. 

๋ณธ ํ”„๋กœ์ ํŠธ๋Š” ํŒจ์บ  ๊ฐ•์˜๋ฅผ ์ฐธ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

<์ด์ „ ๊ธ€>

https://silvercoding.tistory.com/13

 

[DJANGO ๊ธฐ์ดˆ] 3. Django admin, ๊ฐœ๋ฐœ ์„œ๋ฒ„ ํ™œ์šฉ

๋ณธ ํ”„๋กœ์ ํŠธ๋Š” ํŒจ์บ  ๊ฐ•์˜๋ฅผ ์ฐธ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. <์ด์ „ ๊ธ€> https://silvercoding.tistory.com/12 https://silvercoding.tistory.com/11 [DJANGO ๊ธฐ์ดˆ] ๊ฐ€์ƒํ™˜๊ฒฝ ์„ค์ • ๋ฐ ์•ฑ ์ƒ์„ฑ ํ”„๋ ˆ์ž„ ์›Œํฌ - ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์ฝ”๋“œ๋ฅผ..

silvercoding.tistory.com

 

Tamplate์€ Bootstrap ์„ ์ด์šฉํ•˜์—ฌ ์ž‘์„ฑํ•ด์ค€๋‹ค. 

์ž‘์—…์„ ํ•  ๋•Œ ์ €์žฅํ•˜๋Š” ์Šต๊ด€์„ ๊ผญ ๋“ค์—ฌ์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค. ์ €์žฅ ์•ˆํ•˜๊ณ  ํŽ˜์ด์ง€ ์‹คํ–‰ํ•ด์„œ ์—๋Ÿฌ๋œฌ๊ฒƒ๋งŒ ์˜ค์ฒœ๋งŒ๋ฒˆ์ด๋‹ค.

 

Bootstrap ์ด์šฉ์„ ์œ„ํ•ด ๋‹ค์Œ ๋งํฌ์—์„œ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์˜ค๋ฉด ๋œ๋‹ค. 

https://getbootstrap.com/docs/5.0/getting-started/introduction/

 

Introduction

Get started with Bootstrap, the world’s most popular framework for building responsive, mobile-first sites, with jsDelivr and a template starter page.

getbootstrap.com

 

ํšŒ์›๊ฐ€์ž… ์ฐฝ ๋งŒ๋“ค๊ธฐ 

1. Template ์ž‘์„ฑํ•˜๊ธฐ

  •  user ํด๋” ---> templates ํด๋”  ---> register.html  

Getting started -- CSS ๋ถ€๋ถ„๊ณผ Javascript ๋ถ€๋ถ„์„ headํƒœ๊ทธ ์•ˆ์— ๋„ฃ์–ด์ค€๋‹ค. starter template ์—์„œ metaํƒœ๊ทธ๋„ ๊ฐ€์ ธ์™€ ์ค€๋‹ค. 

<html>

    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">    

        <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-+0n0xVW2eSR5OomGNYDnhzAbDsOXxcvSN1TPprVMTNDbiYZCxYbOOl7+AMvyTG2x" crossorigin="anonymous">
        <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-gtEjrD/SeCtmISkJkNUaaKMoLD0//ElJ19smozuHV6z3Iehds+3Ulb9Bn9Plx0x4" crossorigin="anonymous"></script>
        <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js" integrity="sha384-IQsoLXl5PILFhosVNubq5LC7Qb9DXgDA9i+tQ8Zj3iwWAwPtgFTxbJ8NT4GN1R8p" crossorigin="anonymous"></script>
        <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/js/bootstrap.min.js" integrity="sha384-Atwg2Pkwv9vp0ygtn1JAojH0nYbwNJLPhwyoVbhoPwBhjQPR5VtM2+xf0Uwh9KtT" crossorigin="anonymous"></script>
    </head>

    <body>
    </body> 

</html>

๊ทธ๋Ÿผ ์šฐ์„  ์ด๋Ÿฐ ๋ชจ์–‘์„ ๋ˆ๋‹ค. 

 

 

Forms --- Overview ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค!

<html>

    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">

        <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-+0n0xVW2eSR5OomGNYDnhzAbDsOXxcvSN1TPprVMTNDbiYZCxYbOOl7+AMvyTG2x" crossorigin="anonymous">
        <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-gtEjrD/SeCtmISkJkNUaaKMoLD0//ElJ19smozuHV6z3Iehds+3Ulb9Bn9Plx0x4" crossorigin="anonymous"></script>
        <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js" integrity="sha384-IQsoLXl5PILFhosVNubq5LC7Qb9DXgDA9i+tQ8Zj3iwWAwPtgFTxbJ8NT4GN1R8p" crossorigin="anonymous"></script>
        <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/js/bootstrap.min.js" integrity="sha384-Atwg2Pkwv9vp0ygtn1JAojH0nYbwNJLPhwyoVbhoPwBhjQPR5VtM2+xf0Uwh9KtT" crossorigin="anonymous"></script>
    </head>

    <body>
        <div class="container">
            <div class="col-12 text-center">
                <h1>ํšŒ์›๊ฐ€์ž…</h1>
            </div>
        </div>
        <div class="row">
            <form>
                <div class="mb-3">
                    <label for="exampleInputEmail1" class="form-label">Email address</label>
                    <input type="email" class="form-control" id="exampleInputEmail1" aria-describedby="emailHelp">
                    <div id="emailHelp" class="form-text">We'll never share your email with anyone else.</div>
                </div>
                <div class="mb-3">
                    <label for="exampleInputPassword1" class="form-label">Password</label>
                    <input type="password" class="form-control" id="exampleInputPassword1">
                </div>
                <div class="mb-3 form-check">
                    <input type="checkbox" class="form-check-input" id="exampleCheck1">
                    <label class="form-check-label" for="exampleCheck1">Check me out</label>
                </div>
                <button type="submit" class="btn btn-primary">Submit</button>
            </form>
        </div>
    </body>

</html>

ํšŒ์›๊ฐ€์ž… ๊ธ€์”จ ๋„ฃ์–ด์ฃผ๊ณ  ๊ทธ ๋ฐ‘์— ํšŒ์›๊ฐ€์ž… form์„ ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค. 

 

ํด๋”์— ์ €์žฅ๋œ register.html ์„ ์—ด์–ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹คํ–‰์ด ๋œ๋‹ค. 

 

๋””์ž์ธ์ด ๋งˆ์Œ์— ์•ˆ๋“œ๋‹ˆ ๋ฐ”๊พธ์–ด ์ค€๋‹ค. 

- ํ•œ๊ธ€๋กœ ๋ฐ”๊พธ๊ธฐ, container ์ ์šฉ, placeholder ์ž‘์„ฑํ•ด์ฃผ๊ธฐ

<html>

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-+0n0xVW2eSR5OomGNYDnhzAbDsOXxcvSN1TPprVMTNDbiYZCxYbOOl7+AMvyTG2x" crossorigin="anonymous">
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-gtEjrD/SeCtmISkJkNUaaKMoLD0//ElJ19smozuHV6z3Iehds+3Ulb9Bn9Plx0x4" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js" integrity="sha384-IQsoLXl5PILFhosVNubq5LC7Qb9DXgDA9i+tQ8Zj3iwWAwPtgFTxbJ8NT4GN1R8p" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/js/bootstrap.min.js" integrity="sha384-Atwg2Pkwv9vp0ygtn1JAojH0nYbwNJLPhwyoVbhoPwBhjQPR5VtM2+xf0Uwh9KtT" crossorigin="anonymous"></script>
</head>

<body>
    <div class="container">
        <div class="row-mt5">
            <div class="col-12 text-center">
                <h1>ํšŒ์›๊ฐ€์ž…</h1>
            </div>
        </div>
        <div class="row mt-5">
            <form>
                <div class="form-group mb-3">
                    <label for="username" class="form-label">์‚ฌ์šฉ์ž ์ด๋ฆ„</label>
                    <input type="text" class="form-control" id="username" placeholder="์‚ฌ์šฉ์ž ์ด๋ฆ„">
                </div>
                <div class="form-group mb-3">
                    <label for="password" class="form-label">๋น„๋ฐ€๋ฒˆํ˜ธ</label>
                    <input type="password" class="form-control" id="password" placeholder="๋น„๋ฐ€๋ฒˆํ˜ธ">
                </div>
                <div class="form-group mb-3">
                    <label for="re-password" class="form-label">๋น„๋ฐ€๋ฒˆํ˜ธ ํ™•์ธ</label>
                    <input type="password" class="form-control" id="re-password" placeholder="๋น„๋ฐ€๋ฒˆํ˜ธ ํ™•์ธ">
                </div>
                <button type="submit" class="btn btn-primary">๋“ฑ๋ก</button>
            </form>
        </div>
    </div>

</body>

</html>

์›ํ•˜๋Š” ๋Œ€๋กœ ์ž‘์„ฑ์ด ์™„๋ฃŒ ๋˜์—ˆ๋‹ค. 

 

 

 

2. View ์ž‘์„ฑํ•˜๊ธฐ 

- community ---> user ---> views.py 

from django.shortcuts import render

def register(request):
    return render(request, "register.html")

register ํ•จ์ˆ˜ ์ž‘์„ฑํ•˜๊ธฐ. request๋ฅผ ๊ผญ ๊ฐ™์ด ์ „๋‹ฌํ•ด ์ฃผ์–ด์•ผ ํ•˜๊ณ , ๋ฐ˜ํ™˜ํ•˜๊ณ ์ž ํ•˜๋Š” html ํŒŒ์ผ์„ ์ž‘์„ฑํ•ด ์ค€๋‹ค.

 

- community --> urls.py 

urlpatterns = [
    ...
    path('user/', include('user.urls'))

]

urlpatterns ์•ˆ์— user ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ด์ค€๋‹ค. 

 

 

- community ---> user ---> urls.py 

user ํด๋” ์•ˆ์— urls.py๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. 

from django.urls import path
from . import views


urlpatterns = [
    path('register/', views.register)
]

views.py์˜ register ํ•จ์ˆ˜๋ฅผ import ํ•˜์—ฌ ์ „๋‹ฌํ•ด์ค€๋‹ค. ์ด๋ ‡๊ฒŒ ์ž‘์„ฑ์„ ํ•ด๋†“์œผ๋ฉด .../user/register ๊ฒฝ๋กœ๋ฅผ ์น˜๋ฉด register.html์ด ๋ Œ๋”๋ง ๋  ๊ฒƒ์ด๋‹ค. 

 

 

 

- ๊ฐœ๋ฐœ์ž ์„œ๋ฒ„ ๋“ค์–ด๊ฐ€๋ณด๊ธฐ 

ํ„ฐ๋ฏธ๋„

python manage.py runserver

์ด์ œ ์„œ๋ฒ„๋กœ ๋“ค์–ด๊ฐ€์„œ ํ™•์ธ์„ ํ•ด๋ณด์ž. 

ํ„ฐ๋ฏธ๋„์— ๋œจ๋Š” ์ฃผ์†Œ ๋’ค์— /user/register ์ž‘์„ฑ์„ ํ•ด์ค€๋‹ค. 

 

๊ทธ๋Ÿฌ๋ฉด ์ด๋ ‡๊ฒŒ ์ž˜ ์—ฐ๊ฒฐ์ด ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. 

 

 

 

 

๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์ด์ฌ ์ชฝ์œผ๋กœ ์ „๋‹ฌ 

์ฃผ์†Œ๋ฅผ ์ณ์„œ ํšŒ์›๊ฐ€์ž… ์ฐฝ์œผ๋กœ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์œผ๋‹ˆ, ์ด์ œ๋Š” POST์š”์ฒญ์„ ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„๋กœ ์ „๋‹ฌํ•ด์ฃผ๋Š” ์ž‘์—…์„ ํ•ด์•ผํ•œ๋‹ค. 

 

1. Template ์ž‘์„ฑํ•˜๊ธฐ

community ---> user ---> register.html  

 

  ...
  		 <form method="POST" , action=".">
                    {% csrf_token %}
                    <div class="form-group mb-3">
                        <label for="username" class="form-label">์‚ฌ์šฉ์ž ์ด๋ฆ„</label>
                        <input type="text" class="form-control" id="username" placeholder="์‚ฌ์šฉ์ž ์ด๋ฆ„" name="username">
                    </div>
                    <div class="form group mb-3">
                        <label for="password" class="form-label">๋น„๋ฐ€๋ฒˆํ˜ธ</label>
                        <input type="password" class="form-control" id="password" placeholder="๋น„๋ฐ€๋ฒˆํ˜ธ" name="password">
                    </div>
                    <div class="form group mb-3">
                        <label for="re-password" class="form-label">๋น„๋ฐ€๋ฒˆํ˜ธ ํ™•์ธ</label>
                        <input type="password" class="form-control" id="re-password" placeholder="๋น„๋ฐ€๋ฒˆํ˜ธ ํ™•์ธ" name="re-password">
                    </div>
                    <button type="submit" class="btn btn-primary">๋“ฑ๋ก</button>
                </form>
  ...

๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์ด์ฌ ์ชฝ์œผ๋กœ ์ „๋‹ฌํ•ด์ฃผ๋Š” ์ฝ”๋“œ์ด๋‹ค. POST method๋กœ ์ „๋‹ฌํ•˜๊ณ , action="."์€ ํ˜„์žฌ ์ฃผ์†Œ๋กœ ์ „๋‹ฌํ•˜๊ฒ ๋‹ค๋Š” ๋œป์ด๋‹ค.           

form ์•ˆ์— {% csrf_token %}  ์ด๊ฒƒ์„ ๊ผญ ๋„ฃ์–ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. 

 

form ์€ data ๋ฅผ ์„œ๋ฒ„์— ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ธ๋ฐ, ์•ˆ์ข‹๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ๋‹ค๋ฅธ ์›น์‚ฌ์ดํŠธ์—์„œ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์„ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์ฝ”๋“œ๋ผ๊ณ  ํ•œ๋‹ค.  ํฌ๋กœ์Šค ๋„๋ฉ”์ธ์„ ๋ง‰๊ธฐ ์œ„ํ•ด ์•”ํ˜ธํ™”๋œ ํ‚ค๋ฅผ ์ˆจ๊ฒจ๋†“๋Š”๋‹ค. ๊ทธ๋ž˜์„œ ํ‚ค๊ฐ€ ์—†์œผ๋ฉด ์ž˜๋ชป๋œ ์š”์ฒญ์œผ๋กœ ๋ฐ›์•„๋“ค์—ฌ ์š”์ฒญ์„ ๊ฑฐ์ ˆํ•˜๊ฒŒ ๋œ๋‹ค. ํ•„์ˆ˜์ ์ธ ์ฝ”๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์— ์•ˆ์จ์ฃผ๋ฉด ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค!

 

๊ทธ๋ฆฌ๊ณ  input ํƒœ๊ทธ์— name ์†์„ฑ๋„ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค. ์ด name ๊ฐ’์œผ๋กœ ์ •๋ณด๊ฐ€ ์ „๋‹ฌ์ด ๋  ๊ฒƒ์ด๋‹ค.

 

 

 

 

2. View ์ž‘์„ฑํ•˜๊ธฐ 

community ---> user ---> view.py 

from django.shortcuts import render
from .models import User

def register(request):
    if request.method == 'GET':
        return render(request, "register.html")
    elif request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        re_password = request.POST['re-password']

    user = User(
                Username = username,
                password = password
            )

    user.save()

    return render(request, "register.html")

์š”์ฒญ ๋ฐฉ๋ฒ•์ด GET์ผ ๋•Œ์™€ POST ์ผ ๋•Œ๋ฅผ ๋‹ค๋ฅด๊ฒŒ ์ž‘์„ฑํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค. 

 

 

์—ฌ๊ธฐ๊นŒ์ง€ ํ•ด์„œ silver 123456 ์œผ๋กœ ํšŒ์›๊ฐ€์ž…์„ ํ•˜๊ณ  admin์— ๋“ค์–ด๊ฐ€ ๋ณด๋‹ˆ user ์ƒ์„ฑ์ด ์ž˜ ๋˜์–ด์žˆ๋‹ค.

 

 

 

 

 

 

3. ๋น„๋ฐ€๋ฒˆํ˜ธ ํ™•์ธํ•˜๊ธฐ 

community ---> user ---> view.py .py

from django.shortcuts import render
from .models import User

def register(request):
    if request.method == 'GET':
        return render(request, "register.html")
    elif request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        re_password = request.POST['re-password']

        res_data = {}

        if password != re_password:
            res_data['error'] = "๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค."
        else:
            user = User(
                Username = username,
                password = password
            )

            user.save()
            
        return render(request, "register.html", res_data)

res_data๋ผ๋Š” dictionary๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๊ณ  password์™€ re_password์˜ ๊ฐ’์ด ๋‹ค๋ฅด๋ฉด res_data์˜ ํ‚ค๊ฐ’์„ error, value๊ฐ’์„ ๋ฌธ์ž์—ด๋กœ ์ €์žฅํ•ด์ค€๋‹ค. ๊ทธ๋‹ค์Œ render ํ•จ์ˆ˜์— res_data๋ฅผ ์ „๋‹ฌํ•ด ์ค€๋‹ค. 

 

 

community ---> user ---> register.html  

...
	<div class="row-mt5">
            <div class="col-12 text-center">
                <h1>ํšŒ์›๊ฐ€์ž…</h1>
            </div>
        </div>
        <div class="row mt-5">
            <div class="col-12">
                {{error}}
            </div>
        </div>
...

๊ทธ๋‹ค์Œ ํšŒ์›๊ฐ€์ž… ๋ฐ‘์— ์—๋Ÿฌ ๋ฌธ์ž์—ด์„ ๊ทธ๋ ค์ค„ ๋ถ€๋ถ„์„ ํ•˜๋‚˜ ๋งŒ๋“ ๋‹ค. {{}} ์•ˆ์— res_data์˜ ํ‚ค ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค. 

register.html ์„ ๋žœ๋”๋ง์„ ํ• ๋•Œ res_data๋ผ๋Š” ๊ฐ’์„ ๋„˜๊ธฐ๋ฉด res_data์˜ ํ‚ค์™€ {{error}}๊ฐ€ ๋งคํ•‘์ด ๋œ๋‹ค.

 

 

--- ํ™•์ธํ•ด๋ณด๊ธฐ 

 

๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋‹ค๋ฅด๊ฒŒ ์น˜๋ฉด ์œ„์™€๊ฐ™์ด ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ํ™•์ธ ํ•ด ๋ณด์•˜๋‹ค. 

 

 

 

 

4. ๋ชจ๋“  ๊ฐ’์ด ์ž…๋ ฅ๋˜์ง€ ์•Š์•˜์„ ๋•Œ ์ฒ˜๋ฆฌ & ๋น„๋ฐ€๋ฒˆํ˜ธ ์•”ํ˜ธํ™” 

์œ„์—๊นŒ์ง€ ์ž‘์—…์„ ๋งˆ์ณค์„ ๋•Œ ๋ฌธ์ œ์ ์ด ์žˆ๋‹ค. 

์‚ฌ์šฉ์ž ์ด๋ฆ„, ๋น„๋ฐ€๋ฒˆํ˜ธ, ๋น„๋ฐ€๋ฒˆํ˜ธ ํ™•์ธ์„ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๊ฐ€ ๋œจ์ง€ ์•Š์œผ๋ฉฐ, 

์‚ฌ์ง„๊ณผ ๊ฐ™์ด ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ๊ณต๊ฐœ๋˜๋ฏ€๋กœ ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋น„๋ฐ€๋ฒˆํ˜ธ ์•”ํ˜ธํ™”๊นŒ์ง€ ์ž‘์„ฑ์„ ํ•ด์ค€๋‹ค. 

 

community ---> user ---> view.py .py

from django.shortcuts import render
from .models import User
from django.contrib.auth.hashers import make_password

def register(request):
    if request.method == 'GET':
        return render(request, "register.html")
    elif request.method == 'POST':
        username = request.POST.get('username', None) ## ๊ธฐ๋ณธ ๊ฐ’ ์„ค์ •
        password = request.POST.get('password', None)
        re_password = request.POST.get('re-password', None)

        res_data = {}


        if not (username and password and re_password):
            res_data['error'] = "๋ชจ๋“  ๊ฐ’์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”."
        elif password != re_password:
            res_data['error'] = "๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค."
        else:
            user = User(
                Username = username,
                password = make_password(password)
            )

            user.save()
            
        return render(request, "register.html", res_data)

์ตœ์ข…์ ์œผ๋กœ ์ด๋ ‡๊ฒŒ ์ž‘์„ฑ ์™„๋ฃŒ. makepassword๋ฅผ importํ•˜์—ฌ password๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ๋น„๋ฐ€๋ฒˆํ˜ธ ์•”ํ˜ธํ™”๊ฐ€ ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  request.POST์— getํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ธฐ๋ณธ ๊ฐ’์„ None์œผ๋กœ ์„ค์ •ํ•ด์ค€๋‹ค. ๊ทธ๋‹ค์Œ username, password, re_password๋ฅผ and๋กœ ์—ฐ๊ฒฐํ•ด์ฃผ์–ด ํ•˜๋‚˜๋ผ๋„ ์ž‘์„ฑ์ด ๋˜์ง€ ์•Š์œผ๋ฉด error ๋ฉ”์‹œ์ง€๊ฐ€ ๋œจ๊ฒŒ ์ž‘์„ฑํ•ด์ค€๋‹ค. 

 

 

๊ฒฐ๊ณผ ํ™•์ธ

๋ชจ๋“  ๊ฐ’์„ ์ž…๋ ฅํ•˜์ง€ ์•Š์•˜๋”๋‹ˆ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๊ฐ€ ๋œฌ๋‹ค. 

silver2๋กœ ๊ฐ€์ž…์„ ๋‹ค์‹œ ํ•ด์ฃผ์—ˆ๋”๋‹ˆ ์•”ํ˜ธํ™”๋œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ ๋œจ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. 

 

 

 

 

--- ์—ฌ๊ธฐ์„œ model์˜ field(ex, ์‚ฌ์šฉ์ž ์ด๋ฉ”์ผ) ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•œ ์ ˆ์ฐจ (ํฌ์ŠคํŒ…์€ ์ƒ๋žต)

model field ์ž‘์„ฑ ---> migration ---> register.html ์ž‘์„ฑ ---> view.py ์ž‘์„ฑ 

์‚ฌ์šฉ์ž ์ด๋ฉ”์ผ field๋ฅผ ์ถ”๊ฐ€ํ•œ ๊ฒฐ๊ณผ์ด๋‹ค. 

 

 

 

์ •๋ง ๊ธด ์—ฌ์ •์ด์—ˆ๋‹ค. ๋‹ค์Œ์—๋Š” static ํŒŒ์ผ ๊ด€๋ฆฌ์™€ CDN ์— ๋Œ€ํ•˜์—ฌ ์•Œ์•„๋ณผ ์˜ˆ์ •์ด๋‹ค. 

 

๋ณธ ํ”„๋กœ์ ํŠธ๋Š” ํŒจ์บ  ๊ฐ•์˜๋ฅผ ์ฐธ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

<์ด์ „ ๊ธ€>

https://silvercoding.tistory.com/12

 

[DJANGO ๊ธฐ์ดˆ] 2. MTV์˜ Model ์ƒ์„ฑ, sqlite db ๊ธฐ๋ณธ์ ์ธ ๊ด€๋ฆฌ

๋ณธ ํ”„๋กœ์ ํŠธ๋Š” ํŒจ์บ  ๊ฐ•์˜๋ฅผ ์ฐธ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. <์ด์ „ ๊ธ€> https://silvercoding.tistory.com/11 [DJANGO ๊ธฐ์ดˆ] ๊ฐ€์ƒํ™˜๊ฒฝ ์„ค์ • ๋ฐ ์•ฑ ์ƒ์„ฑ ํ”„๋ ˆ์ž„ ์›Œํฌ - ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์ฒด๊ณ„ํ™” ํ•˜์—ฌ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„

silvercoding.tistory.com

 

 

 

admin์ด ๋ฌด์—‡์ธ๊ฐ€?

admin์€ django๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ์ƒ์„ฑ์ด ๋˜์–ด์žˆ๋‹ค. ์ด๋ฅผ ํ™•์ธํ•ด ๋ณด์ž.

1. community ํด๋” ---> settings.py 

INSTALLED_APPS์— ๊ธฐ๋ณธ์ ์œผ๋กœ ๋“ค์–ด๊ฐ€ ์žˆ๋‹ค. (๊ฐ€์žฅ ์ฒซ๋ฒˆ์งธ ์ค„) 

 

2. community ํด๋” ---> urls.py

์—ฌ๊ธฐ์—๋„ ๊ธฐ๋ณธ์ ์œผ๋กœ admin ์ด ์ƒ์„ฑ๋˜์–ด ์žˆ๋‹ค. 

jango ์•ˆ์˜ admin์ด ๊ฒฝ๋กœ admin ์•„๋ž˜์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค. 

๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€์—์„œ ์—ฌ๋Ÿฌ url๋“ค์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— jango์˜ admin ์•ˆ์— ์—ฌ๋Ÿฌ๊ฐ€์ง€ url ๋“ค์ด ์ •์˜๊ฐ€ ๋˜์–ด์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ์‚ฌ์šฉ๋˜๋Š” url๋“ค์ด jango์˜ admin์•ˆ์— ์ •์˜๊ฐ€ ๋˜์–ด์žˆ๋‹ค๋Š” ์†Œ๋ฆฌ์ด๊ณ , ๊ทธ๊ฒƒ๋“ค์„ ํ”„๋กœ์ ํŠธ ์•ˆ์—์„œ admin/ ๊ฒฝ๋กœ ํ•˜์œ„์— ์ง€์ •์„ ํ•ด๋†“๋Š” ๊ฒƒ์ด๋‹ค. 

 

์ฃผ์†Œ๋ฅผ ์ž…๋ ฅํ•  ๋•Œ (ex) silver.com/admin/..... ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ---> admin ํ•˜์œ„์— ๋“ค์–ด๊ฐ€๋Š” ์ฃผ์†Œ๋“ค(.....) ์€ admin.site.urls ์•ˆ์— ์ •์˜๋œ url์„ ๋”ฐ๋ผ๊ฐ€๋Š” ๊ฒƒ์ด๋‹ค. 

 

๋‹จ์ˆœํ•˜๊ฒŒ ๋งํ•˜๋ฉด ์ฃผ์†Œ๋’ค์— admin์„ ๋ถ™์ด๋ฉด ์žฅ๊ณ ์˜ ๊ด€๋ฆฌ์ž ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ด๋‹ค. ๋ณต์žกํ•˜๋‹ˆ ์ด๋ ‡๊ฒŒ ์ดํ•ดํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค. 

 

 

 

๊ฐœ๋ฐœ ์„œ๋ฒ„์— ๋“ค์–ด๊ฐ€๋ณด์ž

ํ„ฐ๋ฏธ๋„

python manage.py runserver

์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•ด์ฃผ๋ฉด ๊ฐœ๋ฐœ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

starting development ---- ๋’ค์— ์ฃผ์†Œ๊ฐ€ ๋‚˜์˜จ๋‹ค. ์ด ์ฃผ์†Œ/admin์„ ์ฃผ์†Œ์ฐฝ์— ์น˜๋ฉด

 

์•„์ด๋”” ํŒจ์Šค์›Œ๋“œ๋ฅผ ๋งŒ๋“ค์–ด์ค€ ์ ์ด ์—†๋Š”๋ฐ ๋กœ๊ทธ์ธ์„ ํ•˜๋ผ๊ณ  ํ•œ๋‹ค. 

 

 

๊ทธ๋ž˜์„œ ์ด๊ฑธ ๋งŒ๋“ค์–ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค

๊ฐœ๋ฐœ์„œ๋ฒ„๋Š” ctrl + c ๋กœ ์ข…๋ฃŒ ํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

 

- ์•„์ด๋”” ํŒจ์Šค์›Œ๋“œ ๋งŒ๋“ค๊ธฐ

ํ„ฐ๋ฏธ๋„

python manage.py createsuperuser

์ด๊ฑธ ์ณ์„œ ์•„์ด๋””, ํŒจ์Šค์›Œ๋“œ๋ฅผ ๋งŒ๋“ค์–ด ์ค€๋‹ค. 

 

๊ทธ๋‹ค์Œ ๋‹ค์‹œ ์‹คํ–‰์‹œ์ผœ ๋กœ๊ทธ์ธํ•˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด๋Ÿฌํ•œ ์ฐฝ์ด ์ƒ๊ฒจ์ ธ์žˆ๋‹ค. 

Users์— ๋“ค์–ด๊ฐ€๋ณด๋ฉด ๋ฐฉ๊ธˆ ๋งŒ๋“  user์ •๋ณด๊ฐ€ ๋“ค์–ด๊ฐ€์ ธ ์žˆ๋‹ค. 

 

 

 

์žฅ๊ณ  admin์— ๋งŒ๋“  model ๋“ฑ๋ก

1. user ํด๋” --> admin.py 

...
from .models import User

class userAdmin(admin.ModelAdmin):
    pass

admin.site.register(User, userAdmin)

User ํด๋ž˜์Šค๋ฅผ import ํ•ด์ฃผ๊ณ , ๊ด€๋ฆฌ์ž์— ์“ธ ๋‚ด์šฉ๋“ค์„ ๊ธฐ์ž…ํ•œ๋‹ค. 

 

----> runserver ๋‹ค์‹œ ์‹คํ–‰ ํ›„ ๋“ค์–ด๊ฐ€๋ณด๋ฉด 

๋งŒ๋“  ๋ชจ๋ธ์ด ์ ์šฉ๋˜์—ˆ๋‹ค. 

 

User ์˜ Users์— Add ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ์„œ ์‚ฌ์šฉ์ž๋ฅผ ํ•œ๊ฐœ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค. 

๊ทธ๋Ÿฌ๋ฉด ์ด๋ ‡๊ฒŒ ์ƒ์„ฑ์ด ๋œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ Users๋Š” ์œ„์˜ Users์™€ ๊ฐ™์•„ ํ˜ผ๋™๋˜๊ธฐ๋„ ํ•˜๊ณ , ๊ด€๋ฆฌํ•˜๊ธฐ ์ข‹๊ฒŒ ํ•œ๊ธ€๋กœ ๋ฐ”๊พธ์–ด์ค„ ๊ฒƒ์ด๋‹ค. User object (1) ์ด๋ผ๊ณ  ์ ํ˜€์žˆ๋Š” ๊ฒƒ์€ Username์œผ๋กœ ๋ฐ”๊พธ์–ด์ฃผ๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค. 

 

 

2. Users ๊ธ€์”จ ๋ฐ”๊ฟ”์ฃผ๊ธฐ

user ํด๋” ---> models.py ---> class Meta 

from django.db import models

class User(models.Model):
    
    
    ...
    

    class Meta:
        db_table = 'test_user'
        verbose_name = "์‚ฌ์šฉ์ž" 
        verbose_name_plural = "์‚ฌ์šฉ์ž"  ## ๋ณต์ˆ˜ํ˜• ์ง€์ •

์ง€๋‚œ ๊ธ€์—์„œ ์ž‘์„ฑํ–ˆ๋˜ Meta ํด๋ž˜์Šค์—์„œ verbose_name์„ ์„ค์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค! 

 

 

3. User object ๊ธ€์”จ ๋ฐ”๊ฟ”์ฃผ๊ธฐ 

user ํด๋” ---> models.py ---> def __str__(self)

class User(models.Model):
    
	...

    def __str__(self):
        return self.Username

์ด๋ฒˆ์—๋Š” model.py ์— ํ•จ์ˆ˜๋ฅผ ํ•˜๋‚˜ ์ž‘์„ฑํ•ด์ค€๋‹ค. 

์ „์— User object (1) ๋ผ๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ์ €์žฅ์ด ๋˜์–ด์žˆ์—ˆ๋Š”๋ฐ, ์ด๋Š” Userํด๋ž˜์Šค๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ–ˆ์„ ๋•Œ ๋‚˜์˜ค๋Š” ๊ฐ’์ด๋‹ค. ์ด ๋•Œ ํด๋ž˜์Šค๋ฅผ ๋ฌธ์ž๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ ์–ด๋–ค ๋ฌธ์ž๋กœ ๋ณ€ํ™˜์‹œ์ผœ์ค„ ์ง€ ์ •ํ•˜๋Š” ๋‚ด์žฅํ•จ์ˆ˜๊ฐ€ __str__ ์ธ ๊ฒƒ์ด๋‹ค. 

 

 

user ํด๋” ---> admin.py  ---> class userAdmin

...

class userAdmin(admin.ModelAdmin):
    list_display = ('Username', 'password')
    
...

์ „์— pass๋กœ ๋‚จ๊ฒจ๋’€๋˜ ๋ถ€๋ถ„์„ list_display ํŠœํ”Œ์„ ์ž‘์„ฑํ•ด์ฃผ๋ฉด ์ด ํŠœํ”Œ ์•ˆ์— ์žˆ๋Š” ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๊ฐ€ ๋‚˜ํƒ€๋‚˜๊ฒŒ ๋œ๋‹ค. ์‚ฌ์šฉ์ž๋ช…๋งŒ ๋ณด์˜€๋˜ ๊ฒƒ์ด ๋น„๋ฐ€๋ฒˆํ˜ธ๋„ ํ•จ๊ป˜ ๋ณด์—ฌ์งˆ ๊ฒƒ์ด๋‹ค. 

 

 

 

์ด๋ ‡๊ฒŒ ๊นŒ์ง€ ํ•ด์„œ 

์ตœ์ข…ํ™”๋ฉด

์ง€์ •ํ•œ ๋Œ€๋กœ ๋ชจ๋‘ ์ž˜ ๋ณ€ํ•œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. 

 

 

 

๋‹ค์Œ์—๋Š” MTV ๊ตฌ์กฐ์—์„œ T, V ์ž‘์„ฑ์„ ํ•ด๋ณผ ๊ฒƒ์ด๋‹ค!

 

 

 

๋ณธ ํ”„๋กœ์ ํŠธ๋Š” ํŒจ์บ  ๊ฐ•์˜๋ฅผ ์ฐธ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

<์ด์ „ ๊ธ€>

https://silvercoding.tistory.com/11

 

[DJANGO ๊ธฐ์ดˆ] ๊ฐ€์ƒํ™˜๊ฒฝ ์„ค์ • ๋ฐ ์•ฑ ์ƒ์„ฑ

ํ”„๋ ˆ์ž„ ์›Œํฌ - ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์ฒด๊ณ„ํ™” ํ•˜์—ฌ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ์ฝ”๋“œ ์ง‘ํ•ฉ - ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ˜ผ๋™๋  ์ˆ˜ ์žˆ์ง€๋งŒ ์ข€ ๋” ๊ทœ๋ชจ๊ฐ€ ํฌ๊ณ  ํ”„๋กœ์ ํŠธ์˜ ๊ธฐ๋ฐ˜์ด ๋จ - ๊ฑด์ถ•์— ๋น„์œ ํ•˜๋ฉด ๊ตฌ์กฐ

silvercoding.tistory.com

 

 

 

์ฒ˜์Œ ์‚ฌ์šฉํ•˜๋Š” DJANGO์ธ๋ฐ๋‹ค ๊ฐ•์˜ ๋‚ด์šฉ๋Œ€๋กœ ํ•˜๋ฉด ์•ˆ๋˜๋Š” ๋ถ€๋ถ„๋„ ์žˆ์–ด์„œ ์ง„ํ–‰์†๋„ ๋งˆ์น˜ ๊ฑฐ๋ถ์ด!

 

 

----์ด์ „ ๊ธ€์—์„œ ํ–ˆ๋˜ ๊ฒƒ ์ ๊ฒ€

  • ๊ฐ€์ƒํ™˜๊ฒฝ ์ƒ์„ฑ ๋ฐ ์ ์šฉ
  • django ์„ค์น˜
  • project ์ƒ์„ฑ (community) ---> ์ด๋ฒˆ ๊ธ€์˜ ํ„ฐ๋ฏธ๋„ ์—์„œ ์ž…๋ ฅํ•  ๋•Œ ํŒŒ์ผ ๋์ด community๋กœ ๋˜์–ด์žˆ์–ด์•ผ ํ•œ๋‹ค. (cd community๋กœ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์Œ)
  • app ์ƒ์„ฑ (board, user)
  • app ๋“ฑ๋ก โ˜†โ˜†โ˜† (app๋“ฑ๋ก์ด ๋˜์–ด์žˆ์–ด์•ผ migration ๊ฐ€๋Šฅ/ settings.py ์—์„œ ๋“ฑ๋ก ๊ฐ€๋Šฅ) 

 

์ด๋ฒˆ ์ž‘์—…์€ ์œ„์˜ ์ƒํƒœ์—์„œ ์‹œ์ž‘ํ•œ๋‹ค. ์ž˜ ์•ˆ๋˜๋Š” ๊ฒŒ ์žˆ์œผ๋ฉด ์นจ์ฐฉํ•˜๊ฒŒ ์ ๊ฒ€ ํ•ด๋ณด๊ธฐ.

 

 

MTV ๊ตฌ์กฐ์—์„œ Model ๋งŒ๋“ค๊ธฐ 

1. ๋ชจ๋ธ ์ž‘์„ฑ

user ํด๋” -----> model.py

class User(models.Model):
    Username = models.CharField(max_length=64,
    verbose_name="์‚ฌ์šฉ์ž๋ช…")

    password = models.CharField(max_length=64,
    verbose_name="๋น„๋ฐ€๋ฒˆํ˜ธ")

    registered_dttm = models.DateTimeField(auto_now_add=True,
    verbose_name="๋“ฑ๋ก์‹œ๊ฐ„")

    class Meta:
        db_table = 'test_user'

ํด๋ž˜์Šค ์•ˆ์˜ Metaํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ํ…Œ์ด๋ธ” ์ด๋ฆ„์„ ์ง€์ •ํ•ด ์ค€๋‹ค. 

 

 

2. ๋ชจ๋ธ ๋“ฑ๋ก 

ํ„ฐ๋ฏธ๋„

python manage.py makemigrations user 

 

๋ฐ”๋กœ ํ–ˆ๋”๋‹ˆ app์ด ์—†๋‹ค๊ณ  ์—๋Ÿฌ(;;)๊ฐ€ ๋‚˜๊ธธ๋ž˜ ์ด์ „ ๊ธ€์—์„œ ์•ฑ ๋“ฑ๋ก์„ ํ•ด์ฃผ์—ˆ๋˜ settings.py๋ฅผ ์‹คํ–‰ ์‹œํ‚ค๊ณ , models.py๋„ ์‹คํ–‰์‹œํ‚จ ํ›„ ๋‹ค์‹œ ์ž‘์„ฑํ•ด์ฃผ์—ˆ๋”๋‹ˆ

 Create model User ์™„๋ฃŒ

 

ํ„ฐ๋ฏธ๋„

python manage.py migrate

์ด๋ ‡๊ฒŒ ๋‚˜์˜ค๋ฉด ์„ฑ๊ณต


์ด์ œ sqlite์— ๋“ค์–ด๊ฐ€์„œ ๋“ฑ๋กํ•œ table์„ ํ™•์ธํ•ด ๋ณธ๋‹ค.

 

 

sqlite ์‚ฝ์งˆ

sqlite3 db.sqlite3

๊ฐ•์˜์—์„  ์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•˜์˜€๊ณ , ๋‚˜๋Š” ์‹คํ–‰ํ•  ์ˆ˜ ์—†๋Š” ๋ช…๋ น์–ด! ์˜ค๋ฅ˜๊ฐ€ ๋‚ฌ๋‹ค. ๊ตฌ๊ธ€๋ง ํ•ด๋ณด๋‹ˆ ํ™˜๊ฒฝ๋ณ€์ˆ˜ path ์„ค์ • ๊ด€๋ จ ๋ฌธ์ œ์ธ ๊ฒƒ ๊ฐ™์€๋ฐ ์‹œ๊ฐ„์ด ์—†์–ด์„œ ๊ธฐ๊ฐ! ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์ฐพ์•„๋ดค๋‹ค. ํฝํ•˜๋ฉด ์ด ์—๋Ÿฌ๊ฐ€ ๋‚˜๋‹ˆ ํ•œ๋ฒˆ์ฏค ์กฐ์น˜๋ฅผ ์ทจํ•ด์ฃผ์–ด์•ผ๊ฒ ๋‹ค. 

 

python manage.py dbshell

์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•๋„ ์žˆ์—ˆ๋‹ค. ์˜ค ๊ทธ๋žฌ๋”๋‹ˆ 

CommandError: You appear not to have the 'sqlite3' program installed or on your path.

์ด๋Ÿฌํ•œ ์—๋Ÿฌ๊ฐ€ ๋‚ฌ๋‹ค. ๊ทธ๋ž˜๋„ ์ด๊ฑด ๊ตฌ๊ธ€๋ง ํ•ด๋ณด๋‹ˆ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์–ด๋ณด์—ฌ์„œ ์ด ๋ฐฉ๋ฒ•์œผ๋กœ ์ฑ„ํƒ!

 

----> ์—๋Ÿฌ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•
https://www.sqlite.org/download.html ์—์„œ
sqlite-tools-win32-x86-3350500.zip ์„ค์น˜ 

์••์ถ• ํ’€๊ณ  sqlite3.exe๋ฅผ db.sqlite3๊ฐ€ ์žˆ๋Š” ํด๋” ์•ˆ์— ๋„ฃ์–ด์ค€๋‹ค. 

 

๋‘๊ทผ๋‘๊ทผ ๋‹ค์‹œ ์ž…๋ ฅํ•ด์คฌ๋”๋‹ˆ 

python manage.py dbshell

๋“œ๋””์–ด sqlite์— ๋“ค์–ด๊ฐ€์ง„๋‹ค. 

 

 

 

 

๊ฐ„๋‹จํ•œ sqlite ์‚ฌ์šฉ 

1. table ํ™•์ธ

.table

test_user๋„ ๋“ค์–ด๊ฐ€ ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

 

2. schema ํ™•์ธ

.schema test_user

๋ชจ๋ธ ์ž‘์„ฑ์—์„œ ์ƒ์„ฑํ–ˆ๋˜ field๋“ค์ด ์ž˜ ๋‚˜์˜ค๋ฉด ์„ฑ๊ณต 

 

 

3. model field๋‚ด์šฉ ๋ณ€๊ฒฝ ํ›„ ํ™•์ธํ•ด๋ณด๊ธฐ

class User(models.Model):
    Username = models.CharField(max_length=32,
    verbose_name="์‚ฌ์šฉ์ž๋ช…")

    password = models.CharField(max_length=64,
    verbose_name="๋น„๋ฐ€๋ฒˆํ˜ธ")

    registered_dttm = models.DateTimeField(auto_now_add=True,
    verbose_name="๋“ฑ๋ก์‹œ๊ฐ„")

    class Meta:
        db_table = 'test_user'

Username์˜ max_length๋ฅผ 32๋กœ ๋ฐ”๊พธ๊ณ  ์ ์šฉํ•ด๋ณด์ž. 

 

 

์šฐ์„  sqlite์—์„œ ๋น ์ ธ๋‚˜์˜ค๋ ค๋ฉด 

.q

๋ฅผ ์ž‘์„ฑํ•ด์ฃผ๋ฉด ๋œ๋‹ค. 

 

์ด์ œ ์•ž์˜ ๋‚ด์šฉ๊ณผ ๋˜‘๊ฐ™์ด ํ•ด์ฃผ๋ฉด ๋œ๋‹ค. 

 

model ๋ฐ”๊พธ๊ณ  ์‹คํ–‰์„ ์•ˆ์‹œํ‚ค๊ณ  ๋‹ค์Œ์„ ์ž‘์„ฑํ•˜๋ฉด

python manage.py makemigrations user

No changes detected in app 'user'  ์ด๋Ÿฐ๊ฒŒ ๋œฌ๋‹ค. ์‹คํ–‰์„ ์‹œํ‚ค๊ณ  ๋‹ค์‹œ ์ž‘์„ฑํ•ด์ฃผ๋ฉด ์ •์ƒ์ ์œผ๋กœ Alter field Username on user ๋ผ๋Š” ๋ฉ”์‹œ๊ฐ€ ๋œฌ๋‹ค. (์‹คํ–‰์„ ์•ˆ์‹œ์ผœ๋„ ๋˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค์ฃผ์‹ ๋‹ค๋ฉด ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค) 

 

python manage.py migrate

๊ทธ๋‹ค์Œ ๋˜‘๊ฐ™์ด migrate ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ๊ณ  sqlite์— ๋‹ค์‹œ ๋“ค์–ด๊ฐ€์„œ ํ™•์ธ ํ•ด๋ณด๋ฉด 

 

์œ„์™€ ๊ฐ™์ด Username varchar(32)๋กœ ๋ณ€๊ฒฝ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. 

 

 

 

์ด๋ ‡๊ฒŒ makemigrations ์™€ migrate๋ฅผ ์ด์šฉํ•˜์—ฌ ์ง€์†์ ์œผ๋กœ db์— ์ ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. 

 

 

 

ํ”„๋ ˆ์ž„ ์›Œํฌ 

- ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์ฒด๊ณ„ํ™” ํ•˜์—ฌ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ์ฝ”๋“œ ์ง‘ํ•ฉ 

- ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ˜ผ๋™๋  ์ˆ˜ ์žˆ์ง€๋งŒ ์ข€ ๋” ๊ทœ๋ชจ๊ฐ€ ํฌ๊ณ  ํ”„๋กœ์ ํŠธ์˜ ๊ธฐ๋ฐ˜์ด ๋จ 

- ๊ฑด์ถ•์— ๋น„์œ ํ•˜๋ฉด ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“œ๋Š” ๊ณจ์กฐ๊ฐ€ ํ”„๋ ˆ์ž„ ์›Œํฌ๋ผ๋ฉด ๊ทธ ์™ธ ์ž์žฌ๋“ค์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋จ 

 

์›น๊ฐœ๋ฐœ์— ํ•„์š”ํ•œ ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์กฐ์™€ ์ฝ”๋“œ(ํด๋ž˜์Šค, ํ•จ์ˆ˜ ๋“ฑ) ๊ฐ€ ๋งŒ๋“ค์–ด์ ธ ์žˆ์Œ 

 

 

Django ๋ฌธ์„œ 

https://docs.djangoproject.com/ko/3.2/intro/

 

์‹œ์ž‘ํ•˜๊ธฐ | Django ๋ฌธ์„œ | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com

 

 

๋ณธ ํ”„๋กœ์ ํŠธ๋Š” ํŒจ์บ  ๊ฐ•์˜๋ฅผ ์ฐธ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

 

 

๊ฐ€์ƒํ™˜๊ฒฝ ์„ค์ • (visual studio code)

๊ฐ•์˜ ๋‚ด์šฉ๋Œ€๋กœ ๋”ฐ๋ผํ•˜๋‹ค๊ฐ€ ์•ˆ๋ผ์„œ ์‚ฝ์งˆํ•˜๋‹ค๊ฐ€ ๊ตฌ๊ธ€๋ง ํ•ด์„œ ๊ฐ€์ƒํ™˜๊ฒฝ ์ƒ์„ฑ์„ ํ•ด์ฃผ์—ˆ๋‹ค. 

 

์šฐ์„  ํด๋”๋ฅผ ์—ด์–ด์ค€๋‹ค. 

๊ทธ๋‹ค์Œ ๋ณด๊ธฐ์—์„œ ํ„ฐ๋ฏธ๋„ ํด๋ฆญ 

 

python -m venv testvenv

ํ„ฐ๋ฏธ๋„์— ์œ„์˜ ์ฝ”๋“œ๋ฅผ ์ณ์ฃผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด testvenv ํด๋”๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค. 

 

 

window์—์„œ๋Š” F1 ๋˜๋Š” Ctrl+Shift+P๋ฅผ ๋ˆ„๋ฅด๊ณ , Python Select Interpreter ๋ฅผ ์ž…๋ ฅ ํ›„ ํ•ด๋‹นํ•˜๋Š” ๊ฐ€์ƒํ™˜๊ฒฝ์„ ์„ ํƒํ•ด ์ค€๋‹ค. 

testvenv ์„ ํƒ!

 

 

๊ทธ๋‹ค์Œ ์šฐ์ธก ์ƒ๋‹จ + ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด testvenv ๊ฐ€์ƒํ™˜๊ฒฝ ์„ค์ •์ด ๋œ๋‹ค. 

 

 

 

 

 

DJANGO ์„ค์น˜ ํ›„ app ๋งŒ๋“ค๊ธฐ 

1. django ์„ค์น˜ 

pip install django

ํ„ฐ๋ฏธ๋„์— ์ž…๋ ฅํ•˜๊ธฐ

 

 

2. project ์ƒ์„ฑ 

django-admin startproject community

community ์ž๋ฆฌ์— ์›ํ•˜๋Š” ํด๋” ์ด๋ฆ„์„ ์ž‘์„ฑํ•œ๋‹ค. ๊ทธ๋Ÿผ community ํด๋”๊ฐ€ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์ ธ ์žˆ์„ ๊ฒƒ์ด๋‹ค. 

 

 

 

3. app ์ƒ์„ฑ 

community ์•ˆ์— ์•ฑ์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•

cd community

community ํด๋” ์•ˆ์œผ๋กœ ๋“ค์–ด๊ฐ„๋‹ค. 

django-admin startapp board
django-admin startapp user

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ django-admin๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. board, user์ž๋ฆฌ์— ์›ํ•˜๋Š” ์ด๋ฆ„ ์“ฐ๊ธฐ. 

์ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด community ํด๋” ์•ˆ์— board, user ํด๋”๊ฐ€ ์ƒ๊ธด๋‹ค. 

 

*** mtv ๊ตฌ์กฐ (Model, template, view) ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด templates ํด๋”๋ฅผ ์ƒ์„ฑํ•ด์ค€๋‹ค. 

 

 

 

 

3. app ๋“ฑ๋ก 

๋งˆ์ง€๋ง‰์œผ๋กœ app์„ ๋“ฑ๋กํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค. 

community ํด๋” ์•ˆ์— ์žˆ๋Š” settings.py ๋ฅผ ๋“ค์–ด๊ฐ€์„œ 

INSTALLED_APPS = [
   
     ...,
   
    'board',
    'user'
]

INSTALLED_APPS ๋ฆฌ์ŠคํŠธ ์•ˆ์— app ํด๋” ์ด๋ฆ„์„ ์ž‘์„ฑํ•ด ์ฃผ๋ฉด ๋œ๋‹ค. 

 

 

 

 

 

 

 

+ Recent posts