Django 폼에서 필드를 읽기 전용(readonly) 또는 비활성화(disabled) 설정하기
Django 폼에서 필드를 읽기 전용(readonly) 또는 비활성화(disabled) 설정하기
readonly 속성 사용
from django.forms import ModelForm
class MyForm(ModelForm):
class Meta:
model = MyModel
fields = ['name', 'email']
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['email'].readonly = True
위 코드에서 email
필드는 읽기 전용으로 설정되어 사용자가 값을 변경할 수 없습니다.
disabled 속성 사용
from django.forms import ModelForm
class MyForm(ModelForm):
class Meta:
model = MyModel
fields = ['name', 'email']
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['email'].disabled = True
위 코드에서 email
필드는 비활성화되어 사용자가 값을 변경하거나 선택할 수 없습니다.
참고:
readonly
속성은 사용자가 값을 변경할 수 없도록 하지만, 여전히 필드를 선택하고 값을 볼 수 있습니다.disabled
속성은 사용자가 필드를 선택하거나 값을 볼 수 없도록 합니다.- 위 코드는 모델 폼을 사용하는 예시입니다. 폼 뷰에서 직접 필드를 생성하는 경우에도 같은 방식으로
readonly
또는disabled
속성을 설정할 수 있습니다.
추가 정보
예제 코드
models.py
from django.db import models
class MyModel(models.Model):
name = models.CharField(max_length=255)
email = models.EmailField()
forms.py
from django.forms import ModelForm
class MyForm(ModelForm):
class Meta:
model = MyModel
fields = ['name', 'email']
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# 1. `readonly` 속성 사용
# self.fields['email'].readonly = True
# 2. `disabled` 속성 사용
self.fields['email'].disabled = True
views.py
from django.views.generic import FormView
class MyFormView(FormView):
template_name = 'my_form.html'
form_class = MyForm
def get_success_url(self):
return reverse('home')
my_form.html
{% extends 'base.html' %}
{% block content %}
<h1>My Form</h1>
<form action="{% url 'my_form' %}" method="post">
{% csrf_token %}
<label for="name">Name:</label>
<input type="text" name="name" id="name" value="{{ form.name.value }}">
<br>
<label for="email">Email:</label>
<input type="email" name="email" id="email" value="{{ form.email.value }}" disabled>
<br>
<input type="submit" value="Submit">
</form>
{% endblock %}
설명
models.py
파일은MyModel
이라는 모델을 정의합니다. 이 모델에는name
과email
두 개의 필드가 있습니다.forms.py
파일은MyForm
이라는 모델 폼을 정의합니다. 이 폼은MyModel
모델을 기반으로 하며name
과email
필드를 포함합니다.views.py
파일은MyFormView
라는 폼 뷰를 정의합니다. 이 뷰는my_form.html
템플릿을 사용하고MyForm
폼 클래스를 사용합니다.my_form.html
템플릿은 폼을 표시합니다. 템플릿은name
필드와email
필드를 표시합니다.email
필드는readonly
또는disabled
속성을 사용하여 비활성화됩니다.
실행 방법
- 프로젝트 폴더에서 다음 명령을 실행하여 Django 서버를 시작합니다.
python manage.py runserver
- 이 예제는 기본적인 예시입니다. 필요에 따라 코드를 수정할 수 있습니다.
- Django 폼에 대한 자세한 내용은 Django 공식 문서를 참조하십시오.
Django 폼에서 필드를 읽기 전용(readonly) 또는 비활성화(disabled) 설정하는 대체 방법
템플릿 태그 사용
{% for field in form %}
{% if field.name == 'email' %}
<input type="email" name="{{ field.name }}" value="{{ field.value }}" readonly>
{% else %}
<input type="{{ field.field.widget.input_type }}" name="{{ field.name }}" value="{{ field.value }}">
{% endif %}
{% endfor %}
JavaScript 사용
<script>
document.getElementById('email').disabled = true;
</script>
위 코드는 JavaScript를 사용하여 email
필드를 비활성화합니다.
커스텀 위젯 사용
from django.forms import widgets
class ReadonlyWidget(widgets.TextInput):
def __init__(self, attrs=None):
super().__init__(attrs)
self.attrs['readonly'] = True
class MyForm(ModelForm):
class Meta:
model = MyModel
fields = ['name', 'email']
widgets = {
'email': ReadonlyWidget,
}
위 코드는 ReadonlyWidget
이라는 커스텀 위젯을 정의합니다. 이 위젯은 모든 필드를 읽기 전용으로 설정합니다. MyForm
폼 클래스는 email
필드에 ReadonlyWidget
위젯을 사용합니다.
- 위에 제시된 방법은 상황에 따라 유용할 수 있지만, 일반적으로
readonly
또는disabled
속성을 사용하는 것이 더 간단하고 직관적입니다. - 커스텀 위젯을 사용하는 방법은 가장 복잡하지만, 가장 많은 제어권을 제공합니다.
추가 정보
결론
django forms field