Django在视图中

时间:2018-02-05 10:46:46

标签: django validation django-forms

这是我的观点:

if request.method == 'POST':
        form = TeacherRegister(request.POST)
        #Gets school object from email domain.
        email = form['email'].value().split('@')[1]
        try:
            school = School.objects.get(email_domain = email)
        except ObjectDoesNotExist:
            #add custom error message here

        if form.is_valid():
            user, Teacher = form.save()
            Teacher.school = school
            Teacher.save()
            user.groups.add(Group.objects.get(name='Teacher'))
            #user.is_active to stop users logging in without confirming their emails

            user.is_active = False
            user.save()
            #Sends confirmation link.
            send_confirmation_email(request, user)

            args = {'email': user.email,
                    'link': user.Teacher.school.email_website}

            return render(request, 'email/token_sent.html', args)

        else:
            args = {'form': form,}
            return render(request, 'users/teachers.html', args)

这些是我正在努力解决的问题:

email = form['email'].value().split('@')[1]
try:
    school = School.objects.get(email_domain = email)
except ObjectDoesNotExist:
    #add custom error message here

这是我用于电子邮件字段的HTML:

<div class="required field" >
            {{ form.email.label }}
            {{ form.email }}
            {{ form.email.help_text }}
           <!-- <label>Email</label>
           <input placeholder="Email" type="email" name="email" autofocus="" required="" id="id_email"> -->
        </div>

我怎么能说,如果没有退回学校的对象,就会发现“未找到学校,检查你的电子邮件”的内容?

由于

2 个答案:

答案 0 :(得分:6)

您需要在表单方面执行验证。 以下列形式实施clean_email方法:

def clean_email(self):
    email = self.cleaned_data.get('email')
    email = email.split('@')[1] 
    try:
       school = School.objects.get(email_domain = email)
    except ObjectDoesNotExist:
       raise forms.ValidationError(''School not found, check your email')
    return email

现在在模板中,您可以在email字段后立即显示此错误:

 {{ form.email.label }}
 {{ form.email }}
 {{ form.email.errrors }}
 {{ form.email.help_text }}

答案 1 :(得分:2)

您可以尝试使用Django的内置messages框架。试试这个:

try:
    school = School.objects.get(email_domain = email)
except ObjectDoesNotExist:
    messages.error(request, 'School not found, check your email')

然后在表单上方的某处,添加:

{% if messages %}
    {% for message in messages %}
        <div class="alert {% if message.tags %} alert-{{ message.tags }}{% endif %}">{{ message|safe }}</div>
    {% endfor %}
{% endif %}

希望它有所帮助!

相关问题