아래 질문에 대한 코드를 올려드립니다.

안녕하세요 선생님, 코드를 첨부하여 다시 질문합니다.

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 445

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 오전

와 선생님 대박이네요 정말 감사합니다.... 또 한 가지 질문이 있는데요, 이름, 이메일 주소, 내용을 모두 썼지만 이메일 주소가 올바르지 않을 때에도 잘 오류가 발생합니다. 그런데 이름과 이메일 주소는 그대로인데 내용만 삭제되고 다시 contact 창이 열리네요... 내용도 사라지지 않게는 못하나요? 이건 선생님께서 알려주신 댓글 수정이랑은 조금 상황이 다른 것 같아서요... - earth_js님, 2021년 11월 25일 9:21 오전 추천 , 대댓글
+1 @earth_js님 {{ form.content.value|default_if_none:'' }} 을 {{ form.message.value|default_if_none:'' }} 로 바꿔야 겠네요. - 박응용님, 2021년 11월 25일 11:07 오전 추천 , 대댓글
@박응용님 와... 선생님께서는 어떻게 이렇게 잘 찾으시는건가요... 저는 찾으려고 해도 잘 찾아지지가 않던데... 감사합니다 선생님... - earth_js님, 2021년 11월 25일 11:09 오전 추천 , 대댓글