backend/django

django의 context processor / Forms (form disabled)

seul chan 2017. 4. 16. 23:20

django context processors 사용

base.html, header.html에서 context 값을 넣기 위해서 고군분투하다가 결국 해결했다!

참고한 사이트들

https://docs.djangoproject.com/en/dev/ref/templates/api/#subclassing-context-requestcontext

https://www.webforefront.com/django/setupdjangocontextprocessors.html

http://stackoverflow.com/questions/37176023/access-custom-context-processor-in-django-1-9

http://stackoverflow.com/questions/39339569/django-custom-context-processors-in-render-to-string-method

http://stackoverflow.com/questions/3722174/django-template-inheritance-and-context

http://stackoverflow.com/questions/21062560/django-variable-in-base-html

일단 settings.py의 template에 context_processors에 기본 값들이 추가가 되어있는데, 이를 템플릿에서 기본 context로 사용…하는것 같다. 그래서 내가 직접 여기에 추가를 해주면 기본 값으로 사용이 가능할 듯 하여 추가하였다.

'context_processors': [
  ...
  'blog.context_processors.defaul'
]

로 추가를 해주고, blog 앱 디렉토리에 context_processors.py를 만들어줌.

from blog.models import Category


def default(request):
    code_list = Category.objects.filter(parent_category=1)
    return dict(
    code_list = code_list,
    )

이렇게 넣어주니 기본 html 템플릿에서 {{ for category in code_ilst }} 이런 식으로 카테고리들을 불러올 수 있었다.

이것 외에 requestcontext를 활용해서 request의 기본 값들을 템플릿으로 받아올 수 있게 customizing 할 수 있다는데… 글쎼 잘 모르겠다 ㅠㅠ

Django Forms

기본 html forms 사용을 쉽게 사용하기 위해서 django에서 form을 제공해준다.

기본적으로 forms.py, views, templates 3가지를 만져줘야함

  • 우선 forms.py에서

from django import forms


class NameForm(forms.Form):
    your_name = forms.CharField(label='Your name', max_length=100)

이 폼은 추후에 템플릿에서

<label for="your_name">Your name: </label>
<input id="your_name" type="text" name="your_name" maxlength="100" required />

이런 폼을 만들어준다. 즉, 우리는 그냥 <form>태그와 submit만 만들어 주면 되는 것이다...

  • 그리고 views에서 위의 만들어진 form을 불러준다

from django.shortcuts import render
from django.http import HttpResponseRedirect

from .forms import NameForm # 현재 디렉토리에 만든 forms 파일에서 NameForm을 부르기


def author_register(request):
    if request.method == "POST":
        form = NameForm(request.POST) # 이런 방식으로 받으면 위의 label로 받은 값이 그대로 전달되는지?
        if form.is_valid():
            return HttpResponseRedirect('/posts/')
    else:
        form = NameForm()
        
    return render(
        request,
        "author_register.html",
        {"form": form,}
    )
  • 이후 템플릿에서 기본 form 태그만 만들어 준 후에 {{ form }}으로 불러주면 끝!

<form action="" method="POST">
    {% csrf_token %}
    {{ form }}
    <input type="submit" value="Submit" />
</form>

form에서 사용 가능한 더 많은것들

다양한 필드 사용 가능: form field 공식문서

필드 위젯 사용가능: 위젯을 사용해서 Textarea등의 기능을 구현할수있다. widget 공식문서

Django form 잠시 deactive 시키기 (form.disabled=True)

form = NameForm() if user.is_authenticated==False:   for key in form.fields:       form.fields[key].disabled = True # authenticate 되지 않으면 열리지 않음       form.fields[key].widget.attrs['placeholder'] = '로그인해주세요' # 기본 값 변경도 가능

참고문서들

http://stackoverflow.com/questions/7295395/django-custom-changeuserform-setting-is-active-is-staff-and-is-superuser-to-fa

http://stackoverflow.com/questions/15122895/create-user-inactive-as-default-is-active-default-false : 장고의 signal? 읽어보기

http://stackoverflow.com/questions/4945802/how-can-i-disable-a-model-field-in-a-django-form : 도움 많이됨.

http://stackoverflow.com/questions/324477/in-a-django-form-how-do-i-make-a-field-readonly-or-disabled-so-that-it-cannot : 어렵지만 instance 함수를 활용해서 하는 방법..? 무슨 말인지 잘 모르겠다.

장고에서 이메일 보내기

이메일 공식문서