'전체 글'에 해당되는 글 88건

admin 설정

코딩 연습/Django 2019. 5. 22. 16:31

admin에서 model 등록하기

  • admin에 등록하고자하는 모델을 import한다.
  • @admin.register() 장식자(decorator)를 사용하여 등록한다.
  • 모델 클래스처럼 admin 클래스를 작성하고 별다른 변경사항이 없는 경우 pass 처리한다.
from django.contrib import admin
from .models import Post

@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
	pass

admin 등록 후 Post 모델에 저장된 데이터가 노출된다

 

모델에 저장된 data를 원하는 필드에 맞게 노출시키기

  • list_display는 노출시키고자 하는 필드를 선택
  • list_display_links는 등록한 필드의 데이터에 링크를 걸어 세부내역을 확인할 수 있다
  • search_fields는 해당 필드의 데이터를 검색할 수 있게 해준다.
from django.contrib import admin
from .models import Post

@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
    list_display = ['id', 'title']
    list_display_links = ['id', 'title']
    search_fields = ['title']

ID 필드가 노출되며, 두 필드 모두 링크가 걸려있고, TITLE 검색까지 가능해졌다

 

블로그 이미지

쵸잇

,

폼 샘플 형태

 

나는 Title, Top text, Author 3가지를 입력 받아 책 표지에 제목, 부제, 저자 형태로 출력할 수 있는 폼을 만들고 싶다.

 

 

1) [forms.py]를 앱 폴더에 추가하여 폼의 이름과 필드명, 데이터타입을 지정한다.

- 책의 표지에 쓸 데이터를 입력 받으므로 [CoverForm]으로 지정

- title, top_text, author 모두 문자로 입력 받을 것이므로 [CharField()]를 사용

from django import forms

class CoverForm(forms.Form):
    title = forms.CharField()
    top_text = forms.CharField()
    author = forms.CharField() 

 

 

2) [forms.py]에서 만든 [CoverForm]을 import하여 [views.py]에서 로직을 임시로 작성한다.

- [CoverForm()]을 변수 [form]에 담아 context(ctx)를 통해 [index.html]로 render한다.

from django.shortcuts import render
from .forms import CoverForm

# Create your views here.
def index(request):
	form = CoverForm()
    ctx = {
        'form' : form,
    }
    return render(request, 'cover/index.html', ctx)

 

 

3) [index.html]에서 <form>태그를 작성한다.

- 우리가 웹브라우저에서 볼 수 있는 모양의 폼을 드디어 만든다.

- [action=""]은 입력 받은 데이터를 현재 페이지에서 처리하도록 한다.

- [method="post"]는 데이터를 저장할 수 있게 처리를 해주는 메소드이다.

- 따라서 폼을 통해 입력한 데이터를 현재 페이지에 전송하여 DB로 저장할 수 있게 기본 세팅을 하는 것이다.

<form action="" method="post">
    {% csrf_token %}
      {{ form }}
    <input type="submit" value="Generator O RLY">
</form>

 

 

짜잔, 완성된 폼이다. 

 

샘플과 비교하면 1줄로 작성된게 어색하게 느껴진다

 

<table> 태그를 활용하여 줄바꿈을 할 수 있다. 

<form action="" method="post">
    {% csrf_token %}
    <table>
      {{ form }}
    </table>
    <input type="submit" value="Generator O RLY">
form>

 

샘플과 똑같은 모습을 갖췄다

 

4) [views.py]에서 다시 로직을 구체적으로 구성한다.

- 웹브라우저에서 입력 받아 전송된 데이터를 [index 함수]를 통해 가공을 거친다.

- [CoverForm(request.POST)]는 폼과 폼에 입력된 데이터를 포함하고 있다.

- [is_valid() 메소드]는 데이터의 유효성을 검사하는데, [CharField()]에 해당하는지 검증하는 것이다.

- [cleaned_data]는 데이터를 딕셔너리 타입으로 제공하도록 해준다. 

- 완료시 cover 앱의 index 이름의 URL로 redirect시킨다. 

from django.shortcuts import render
from .forms import CoverForm

# Create your views here.
def index(request):
    if request.method == "POST":
        form = CoverForm(request.POST)
        if form.is_valid():
            form.cleaned_data
            return redirect('cover:index')
    else:
        form = CoverForm()

    ctx = {
        'form' : form,
    }
    return render(request, 'cover/index.html', ctx)
블로그 이미지

쵸잇

,
Internal Server Error: /new/
Traceback (most recent call last):
  File "C:\Users\user\dev\facebook_project\django_env\lib\site-packages\django\db\backends\utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "C:\Users\user\dev\facebook_project\django_env\lib\site-packages\django\db\backends\sqlite3\base.py", line 383, in execute
    return Database.Cursor.execute(self, query, params)
sqlite3.IntegrityError: NOT NULL constraint failed: facebook_article.title

처음보는 낯선 에러였는데, models.py에서 Article클래스 중 title 필드의 값에 null=True를 추가로 기입하니 완료!

블로그 이미지

쵸잇

,