Form & ModelForm
.order_by()
.order_by()
pk μμμΌλ‘ μ λ ¬
articles = Article.objects.order_by('-pk')
ModelForm
ModelForm μ μνκΈ°
forms.py
from django import forms
from .models import Article
class ArticleForm(forms.ModelForm):
title = forms.CharField(
max_length=100,
label='Title',
help_text='Your title must be no more than 100 characters in length',
widget=forms.TextInput(
attrs={
'class':'my_input',
'placeholder': "What's on your mind?"
}
)
)
content = forms.CharField(
label='Content',
help_text='Jot down random musings and thoughts',
widget=forms.Textarea(
attrs={
'row':5,
'col':50,
}
)
)
class Meta:
model = Article
# λ€ λλ €λ°μ
fields = '__all__'
Viewμμ ModelFrom
νμ©
ModelFrom
νμ©view.py
from django.shortcuts import render, redirect, get_object_or_404
from django.views.decorators.http import require_POST
from .models import Article
from .forms import ArticleForm
# Create your views here.
def index(request):
articles = Article.objects.order_by('-pk')
context = {
'articles': articles
}
return render(request, 'articles/index.html', context)
def create(request):
# POST /articles/create/
if request.method == 'POST':
# Article tableμ dataλ₯Ό μ μ₯ν¨
form = ArticleForm(request.POST)
if form.is_valid():
form.save()
#detailλ‘ redirect
return redirect('articles:index')
print('errors?',form.errors)
print('cleaned_data?',form.cleaned_data)
# GET /articles/create
else:
# λΉ κ»λ°κΈ° input form
form = ArticleForm()
context = {
'form': form,
}
return render(request, 'articles/form.html', context)
def detail(request, pk):
article = get_object_or_404(Article, id=pk)
context ={
'article':article
}
return render(request, 'articles/detail.html', context)
@require_POST
def delete(request, pk):
article = get_object_or_404(Article, id=pk)
article.delete()
return redirect('articles:index')
def update(request, pk):
article = get_object_or_404(Article, id=pk)
if request.method == 'POST':
form = ArticleForm(request.POST,instance=article)
if form.is_valid():
article = form.save()
return redirect('articles:detail', article.pk)
else:
form = ArticleForm(instance=article)
context = {
'form':form
}
return render(request, 'articles/form.html', context)
request.resolver_match.url_name
μΌλ‘ 쑰건μ λ°λ₯Έ μ²λ¦¬
request.resolver_match.url_name
μΌλ‘ 쑰건μ λ°λ₯Έ μ²λ¦¬form.html
λΆκΈ°μ κΈ°μ€μ
url_name
μ΄λ€path
λ‘ νλ©΄,url
μ΄ λ°λ λλ§λ€ λ°κΏμ€μΌ νλ€!
<div data-gb-custom-block data-tag="if" data-0='create' data-1='create' data-2='create' data-3='create'>
<h2>Write a post</h2>
<div data-gb-custom-block data-tag="else"></div>
<h2>Edit post</h2>
</div>
loop
or bootstrap4
νμ©νμ¬ μΆλ ₯νκΈ°
loop
or bootstrap4
νμ©νμ¬ μΆλ ₯νκΈ°form.html
<div data-gb-custom-block data-tag="extends" data-0='base.html'></div>
<div data-gb-custom-block data-tag="load" data-0='4' data-1='4' data-2='4' data-3='4' data-4='4' data-5='4' data-6='4' data-7='4' data-8='4' data-9='4'></div>
<div data-gb-custom-block data-tag="block">
<div data-gb-custom-block data-tag="if" data-0='create' data-1='create' data-2='create' data-3='create'>
<h2>Write a post</h2>
<div data-gb-custom-block data-tag="else"></div>
<h2>Edit post</h2>
</div>
<!-- loop νμ©-->
<form action="" method="POST">
<div data-gb-custom-block data-tag="csrf_token"></div>
<div data-gb-custom-block data-tag="for">
<div class="fieldWrapper">
{{ field.errors }}
{{ field.label_tag }} <br>
{{ field }}
<div data-gb-custom-block data-tag="if">
<p class="help">{{ field.help_text|safe }}</p>
</div>
</div>
</div>
<input type="submit" value="Submit">
</form>
<!-- bootstrap4 μ¬μ© -->
<form action="" method="POST">
<div data-gb-custom-block data-tag="csrf_token"></div>
<div data-gb-custom-block data-tag="bootstrap_form"></div>
<button class="btn btn-primary"> Submit</button>
</form>
</div>
shell λ€μ΄κ°κΈ°
python manage.py shell_plus
shell
In [1]: from articles.forms import ArticleForm
In [2]: form = ArticleForm()
In [3]: form
Out[3]: <ArticleForm bound=False, valid=Unknown, fields=(title;content)>
p
tag λ‘ μ΄λ£¨μ΄μ§ inputλ€μ μ§ν©
In [4]: form.as_p()
Out[4]: '<p><label for="id_title">Title:</label> <input type="text" name="title" maxlength="100" required id="id_title"></p>\n<p><label for="id_content">Content:</label> <textarea name="content" cols="40" rows="10" required id="id_content">\n</textarea></p>'
tableλ‘ μ΄λ£¨μ΄μ§ inputλ€μ μ§ν©
In [5]: form.as_table()
Out[5]: '<tr><th><label for="id_title">Title:</label></th><td><input type="text" name="title" maxlength="100" required id="id_title"></td></tr>\n<tr><th><label for="id_content">Content:</label></th><td><textarea name="content" cols="40" rows="10" required id="id_content">\n</textarea></td></tr>'
In [3]: from articles.forms import ArticleForm
In [4]: form = ArticleForm({'title':'μ λͺ©'})
In [5]: print(form)
<tr><th><label for="id_title">Title:</label></th><td><input type="text" name="title" value="μ λͺ©" maxlength="140" required id="id_title"></td></tr>
<tr><th><label for="id_content">Content:</label></th><td><ul class="errorlist"><li>This field is required.</li></ul><textarea name="content" cols="40" rows="10" required id="id_content">
</textarea></td></tr>
Looping over the formβs fields
If youβre using the same HTML for each of your form fields, you can reduce duplicate code by looping through each field in turn using a `
` loop:
<div data-gb-custom-block data-tag="for">
<div class="fieldWrapper">
{{ field.errors }}
{{ field.label_tag }} {{ field }}
<div data-gb-custom-block data-tag="if">
<p class="help">{{ field.help_text|safe }}</p>
</div>
</div>
</div>
Form rendering options
There are other output options though for the
/
pairs:
{{ form.as_table }}
will render them as table cells wrapped in tags{{ form.as_p }}
will render them wrapped in `` tags{{ form.as_ul }}
will render them wrapped in `` tags
Note that youβll have to provide the surrounding or
elements yourself.
Hereβs the output of {{ form.as_p }}
for our ContactForm
instance:
Django Bootstrap μ¬μ©νκΈ°
Install
pip install django-bootstrap4
settings.py μμ
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'articles',
'django_extensions',
'bootstrap4',
]
base.htmlμ bootstrap μ¬μ©ν κ±°λΌκ³ μ μΈ
<!DOCTYPE html>
<div data-gb-custom-block data-tag="load" data-0='4' data-1='4' data-2='4' data-3='4' data-4='4' data-5='4' data-6='4' data-7='4' data-8='4' data-9='4'></div>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Django Test</title>
<div data-gb-custom-block data-tag="bootstrap_css"></div>
</head>
<body>
<h1 class="text-center">CRUD with ModelForm</h1>
<div class="w-75 m-auto">
<hr>
<div data-gb-custom-block data-tag="block">
</div>
</div>
<div data-gb-custom-block data-tag="bootstrap_javascript" data-jquery='full'></div>
</body>
</html>
detail.html - bootstrap μ μ©λλ templateλ€μλ μ μΈ
<div data-gb-custom-block data-tag="extends" data-0='base.html'></div>
<div data-gb-custom-block data-tag="load" data-0='4' data-1='4' data-2='4' data-3='4' data-4='4' data-5='4' data-6='4' data-7='4' data-8='4' data-9='4'></div>
<div data-gb-custom-block data-tag="block">
<h2>Detail</h2>
<hr>
<p ><a href="
<div data-gb-custom-block data-tag="url" data-0='articles:index'></div>"> Back</a></p>
<h3>Post # {{article.pk}}</h3>
<h4>{{article.title}}</h4>
<p>Created at {{article.created_at|date:'Y-m-d H:i'}}</p>
<p>Updated at {{article.updated_at|date:'Y-m-d H:i'}}</p>
<hr>
<p>{{article.content|linebreaks}}</p>
<form action="<div data-gb-custom-block data-tag="url" data-0='articles:update'></div>" method="POST" class="d-inline">
<div data-gb-custom-block data-tag="csrf_token"></div>
<button class="btn btn-warning">μμ </button>
</form>
<form action="
<div data-gb-custom-block data-tag="url" data-0='articles:delete'></div>" method="POST" class="d-inline">
<div data-gb-custom-block data-tag="csrf_token"></div>
<button class="btn btn-danger">μμ </button>
</form>
</div>
+
Git
νΉμ commitμ κΈ°μ€μΌλ‘ λμκ°κΈ°
git checkout f008d8f
test branch λ§λ€λ©΄μ μ΄λνκΈ°
$ git checkout -b test
$ git log --oneline
f008d8f (HEAD -> test) 05 | Article Index
c2be3bc 04 | Article Model
0d28d53 03 | startapp articles
5afc6a9 02 | settings
a046911 01 | startproject
reference log νμΈ
git reflog
μ΄λμ head μλμ§ νμΈ
$ git log --oneline
fc58709 (HEAD -> master, origin/master, origin/HEAD) README.md μΆκ°
fd2e992 06 | Article C with ModelForm
f008d8f (test) 05 | Article Index
c2be3bc 04 | Article Model
0d28d53 03 | startapp articles
5afc6a9 02 | settings
a046911 01 | startproject
λ€μ test branchλ‘ λμκ°κΈ°
$ git checkout test
Switched to branch 'test'
Last updated