아래 질문에 대한 코드를 올려드립니다.
안녕하세요 선생님, 코드를 첨부하여 다시 질문합니다.
contact_form.html
'''
<div style="margin:80px">
<h1>Contact</h1>
<h4>문의와 피드백을 개발자에게 전달해주세요 :)</h4>
<p>
이름, 본인의 이메일 주소 그리고 내용을 정확하게 입력해주세요! <br>
메일 주소를 입력하시지 않을 경우 메일이 전송되지 않습니다. <br>
</p>
<form method="post">
{% csrf_token %}
<!-- 오류표시 Start -->
{% if form.errors %}
<div class="alert alert-danger" role="alert">
{% for field in form %}
{% if field.errors %}
<strong>{{ field.label }}</strong>
{{ field.errors }}
{% endif %}
{% endfor %}
</div>
{% endif %}
<!-- 오류표시 End -->
<div class="form-group">
<label for="name">이름</label>
<input type="text" class="form-control" name="name" id="name"
value="{{ form.name.value|default_if_none:'' }}">
</div>
<div class="form-group">
<label for="email_address">메일 주소</label>
<input type="text" class="form-control" name="email_address" id="email_address"
value="{{ form.email_address.value|default_if_none:'' }}">
</div>
<div class="form-group">
<label for="message">내용</label>
<textarea class="form-control" name="message"
id="message" rows="10">{{ form.content.value|default_if_none:'' }}</textarea>
</div>
<button type="submit" class="btn btn-primary">보내기</button>
</form>
</div>
'''
view.py
'''python
def contact(request):
if request.method == 'POST':
form = ContactForm(request.POST)
if form.is_valid():
subject = "Website Inquiry"
body = {
'name': form.cleaned_data['name'],
'email': form.cleaned_data['email_address'],
'message':form.cleaned_data['message'],
}
message = "\n".join(body.values())
try:
send_mail(subject, message, 'admin@example.com', ['admin@example.com'])
except BadHeaderError:
return HttpResponse('Invalid header found.')
return redirect ("common:contact")
form = ContactForm()
return render(request, "common/contact_form.html", {'form':form})
'''
forms.py
'''python
def value_check(value):
if len(value) == 0:
raise forms.ValidationError('내용을 입력해주세요.')
def email_check(value):
if '@' not in value:
raise forms.ValidationError('올바른 이메일 형식을 입력하세요.')
class ContactForm(forms.Form):
name = forms.CharField(validators=[value_check], max_length = 50)
email_address = forms.EmailField(validators=[email_check], max_length = 150)
message = forms.CharField(validators=[value_check], widget = forms.Textarea, max_length = 2000)
'''
이전에 말씀드린 것 처럼, 이름, 내용, 이메일을 쓰지 않아도 오류 메시지가 출력이 되지 않습니다. 그리고 올바르게 이름, 메일 주소, 내용을 작성하였을 경우 전송은 됩니다.
감사합니다 선생님!
earth_js 님 533
M 2021년 11월 24일 10:34 오후
1개의 답변이 있습니다. 1 / 1 Page
contact 함수를 다음처럼 바꾸어 보세요.
def contact(request):
if request.method == 'POST':
form = ContactForm(request.POST)
if form.is_valid():
subject = "Website Inquiry"
body = {
'name': form.cleaned_data['name'],
'email': form.cleaned_data['email_address'],
'message':form.cleaned_data['message'],
}
message = "\n".join(body.values())
try:
send_mail(subject, message, 'admin@example.com', ['admin@example.com'])
except BadHeaderError:
return HttpResponse('Invalid header found.')
return redirect ("common:contact")
else: # 추가
form = ContactForm() # 들여쓰기
return render(request, "common/contact_form.html", {'form':form})
form.is_valid()
가 false일 경우에 form에 에러메시지가 담기는데 작성하신 contact 함수는 form.is_valid 실패시 form이 무조건 새로 생성되기 때문에 에러메시지가 사라집니다.
박응용 님
2021년 11월 25일 12:38 오전