在使用嵌套模态时,如何区分模板中的Django消息?

在使用嵌套模态时,如何区分模板中的Django消息?,django,django-models,django-templates,django-views,bootstrap-4,Django,Django Models,Django Templates,Django Views,Bootstrap 4,我已经为此绞尽脑汁两天了。任何帮助都会很棒 我认为,我的问题的核心是,我在这两个方面都有嵌套的modals和一个自定义引导表单:第一个用于登录,第二个用于注册。让我们假设在一种情况下,我希望在服务器端执行所有验证,并可能完全控制每个错误验证消息,以及它们应如何以及在何处显示各自的输入。如何使用django.contrib.messages实现这一点 **如果我可以使用Bootstrap 4的一些内置验证方法作为第一道防线,或者像Zurb基金会的Abide那样使用模糊数据验证,那就更好了 每个ba

我已经为此绞尽脑汁两天了。任何帮助都会很棒

我认为,我的问题的核心是,我在这两个方面都有嵌套的modals和一个自定义引导表单:第一个用于登录,第二个用于注册。让我们假设在一种情况下,我希望在服务器端执行所有验证,并可能完全控制每个错误验证消息,以及它们应如何以及在何处显示各自的输入。如何使用django.contrib.messages实现这一点

**如果我可以使用Bootstrap 4的一些内置验证方法作为第一道防线,或者像Zurb基金会的Abide那样使用模糊数据验证,那就更好了

每个base.html模式中的模板标记: models.py
类用户管理器(models.Manager):
def验证(自验证、postData验证、错误验证):
错误={}
如果错误\u验证=='寄存器':
如果不是NAME_REGEX.match(postData['first_NAME']):
错误['first_name']=“first name只能包含
信!”
如果len(postData['last_name'])<1:
错误['last_name']=“姓氏不能为空。”
如果不是NAME_REGEX.match(postData['last_NAME']):
错误['last_name']=“姓氏只能包含字母!”
如果错误\u验证==“登录”:
user=user.objects.filter(email=postData['email'])
如果不是用户:
错误['user_login']=“没有包含该电子邮件的帐户”
我们的系统。”
elif not bcrypt.checkpw(postData['password'].encode(),
用户[0]。密码。编码()):
错误['password\u login']=”无效电子邮件和/或
密码!”
返回错误
base.html中的登录模式

登录
&时代;
{%csrf_令牌%}
没有账户吗?在下面注册

注册 {%if消息%} {消息%中的消息为%s}

{{message}

{%endfor%} {%endif%}
在base.html中注册模态

给我报名!
&时代;
{%csrf_令牌%}
名字
姓
出生日期
电话#
地址
电子邮件
登记
{%if消息%}
{消息%中的消息为%s}

{{message}

{%endfor%} {%endif%}

PSS-如果我能帮助澄清任何其他问题,请让我知道

好吧,我想我解决了自己的问题,并且不得不与其他人分享解决方案,因为我认为我实际上为此失眠了。无论如何,我不确定这是否是Django消息类“extra_tags”属性最初的用途,但出于所有目的,它是一个干净的修复程序,允许我控制服务器端和客户端验证消息


首先,当我创建和附加每个消息实例时,我分别为“注册”和“登录”分配额外的\u标记:

views.py
我检查是否有消息,然后遍历它们,检查标记是否为“register”(或“login”),如果是,则呈现一些文本,如果不是,则不呈现任何内容

base.html
{%if消息%}
{消息%中的消息为%s}
{%if'register'在message.tags%}

{{message}

{%endif%} {%endfor%} {%endif%}

最后但并非最不重要的一点是,在通过任一模式提交表单后,您将需要使用前面提到的错误(或成功)消息重新加载该模式。使每个模态显示其各自的消息
{% if messages %}
    <div class='container-fluid bg-white mt-5 pt-5 pl-4 mb-4'>
        {% for message in messages %}
            <p class="small font-poller text-danger">{{ message }}</p>
        {% endfor %}
    </div>
{% endif %}
def signup(request):
    signup_errors = User.objects.validation(request.POST, 'register')
    if len(signup_errors):
        for error in signup_errors.values():
            messages.error(request, error)
            return redirect('/')
    else:
        new_user = User.objects.create(
            first_name      = request.POST['first_name'],
            last_name       = request.POST['last_name'],
            dob             = request.POST['dob'],
            phone           = request.POST['phone'],
            address         = request.POST['address'],
            city            = request.POST['city'],
            state           = request.POST['state'],
            zipcode         = request.POST['zipcode'],
            email           = request.POST['email'],
            password        = 
bcrypt.hashpw(request.POST['password'].encode(), bcrypt.gensalt()))
        request.session['first_name'] = new_user.first_name
        request.session['id']   = new_user.id
        messages.info(request, 'You have successfully submitted your 
information.')
        return redirect('/menu')


def login(request):
    login_errors = User.objects.validation(request.POST, 'login')
    if len(login_errors):
        for error in login_errors.values():
            messages.error(request, error)
            return redirect('/')
    else:
        current_user = User.objects.get(email=request.POST['email'])
        request.session['first_name']   = current_user.first_name
        request.session['id']           = current_user.id
        messages.info(request, 'You have successfully logged in.')
        return redirect('/menu')
class UserManager(models.Manager):
    def validation(self, postData, error_validation):
        errors = {}
        if error_validation == 'register':
            if not NAME_REGEX.match(postData['first_name']):
                errors['first_name'] = "First name can only contain 
letters!"
            if len(postData['last_name']) < 1:
                errors['last_name'] = "Last name cannot be blank."
            if not NAME_REGEX.match(postData['last_name']):
                errors['last_name'] = "Last name can only contain letters!"
        if error_validation == 'login':
            user = User.objects.filter(email=postData['email'])
            if not user:
                errors['user_login'] = "No account with that email in 
our system."
            elif not bcrypt.checkpw(postData['password'].encode(), 
user[0].password.encode()):
                errors['password_login'] = "Invalid email and/or 
password!"
        return errors
<div class="modal fade text-dark" id="loginModal">
    <div class="modal-dialog">
        <div class="modal-content font-paytone">
            <div class="modal-header shadow p-3 bg_primary rounded">
                <h5 class="modal-title font-poller text-light text_shadow_success2" id="loginModal">Login <i class="fa fa-user text-center ml-1"></i></h5>
                <button class="close" data-dismiss="modal"><span>&times;</span></button>
            </div>
            <div class="modal-body">

                <form id="login-form" action="{% url 'ecommerce_app:login' %}" method="POST" novalidate>
                    {% csrf_token %}
                    <div class="form-group">
                        <input type="email" name="email" class="form-control form-control-lg" placeholder="Email" required>
                    </div>
                    <div class="form-group">
                        <input type="password" name="password" class="form-control form-control-lg" placeholder="Password" required>
                    </div>                          
                    <input id="login-form-submit-btn" type="submit" class="btn btn-success btn-block border bg_primary btn_login" value="Log In">
                </form>

                <p class="pt-2 font-passion">Don't have an account? Sign up below!</p>
                <button id="login-form-signup-btn" class="btn btn-info btn-block border" data-toggle="modal" data-target="#registerModal">Sign Up</button>
            </div>

            {% if messages %}
                <div class="modal-footer">
                    <div class='container-fluid bg-white'>
                        {% for message in messages %}
                            <p class="small font-poller text-danger">{{ message }}</p>
                        {% endfor %}
                    </div>
                </div>
            {% endif %}

        </div>
    </div>
</div>
<div class="modal fade text-dark" id="registerModal">
    <div class="modal-dialog">
        <div class="modal-content font-paytone">
            <div class="modal-header shadow p-3 bg_primary rounded">
                <h5 class="modal-title font-poller text-light text_shadow_info" id="registerModal">Sign Me Up! <i class="fa fa-user-plus ml-1"></i></h5>
                <button class="close" data-dismiss="modal"><span>&times;</span></button>
            </div>
            <div class="modal-body">
                <form id='signup-form' action="/signup/" method="POST" novalidate>
                {% csrf_token %}
                    <div class="form-row">
                        <div class="form-group col-md-6">
                            <label for="first_name">First Name</label>
                            <input type="text" name="first_name" class="form-control" required>
                        </div>
                        <div class="form-group col-md-6">
                            <label for="last_name">Last Name</label>
                            <input type="text" name="last_name" class="form-control" required>
                        </div>
                    </div>

                    <div class="form-row">
                        <div class="form-group col-md-6">
                            <label for="dob">Date of Birth</label>
                            <input type="date" name="dob" class="form-control" required>
                        </div>
                        <div class="form-group col-md-6">
                            <label for="phone">Phone #</label>
                            <input type="tel" name="phone" class="form-control" required>
                        </div>
                    </div>

                    <div class="form-group">
                        <label for="address">Address</label>
                        <input type="text" name="address" class="form-control" placeholder="Street" required>
                    </div>

                    <div class="form-group">
                        <div class="form-row">
                            <div class="col-7">
                              <input type="text" class="form-control" name="city" placeholder="City" required>
                            </div>
                            <div class="col">
                              <input type="text" class="form-control" name="state" placeholder="State" required>
                            </div>
                            <div class="col">
                              <input type="text" pattern="[0-9]{5}" name="zipcode" class="form-control" placeholder="Zip" required>
                            </div>
                        </div>
                    </div>

                    <div class="form-group">
                        <label for="email">Email</label>
                        <input type="email" name="email" class="form-control" required>
                    </div>

                    <div class="form-row">
                        <div class="form-group col-md-6">
                            <!-- <label for="password">Password</label> -->
                            <input type="password" name="password" class="form-control" placeholder="Password" required>
                        </div>
                        <div class="form-group col-md-6">
                            <!-- <label for="confirm">Confirm Password</label> -->
                            <input type="password" name="confirm" class="form-control" placeholder="Confirm Password" required>
                        </div>
                    </div>
                </div>
                <div class="modal-footer">
                        <button type="submit" class="btn btn-info btn-block font-fredoka">Register</button>
                        {% if messages %}
                            <div class='container-fluid bg-white mt-5 pt-5 pl-4 mb-4'>
                                {% for message in messages %}
                                    <p class="small font-poller text-danger">{{ message }}</p>
                                {% endfor %}
                            </div>
                        {% endif %}
                </div>
            </form>
        </div>
    </div>
</div>
def signup(request):
    errors = User.objects.validation(request.POST, 'register')
    if len(errors):
        for error in errors.values():
            messages.add_message(request, messages.ERROR, error, extra_tags="register")
        return redirect('/')

def login(request):
    errors = User.objects.validation(request.POST, 'login')
    if len(errors):
        for error in errors.values():
            messages.add_message(request, messages.ERROR, error, extra_tags="login")
        return redirect('/')
{% if messages %}
    {% for message in messages %}
        {% if 'register' in message.tags %}
            <p class="small font-poller text-danger registration_error_message">{{ message }}</p>
        {% endif %}
    {% endfor %}
{% endif %}
<script>
    $(document).ready(function() {
        {% if messages %}
            {% for message in messages %}
                {% if 'login' in message.tags %}
                    $('#loginModal').modal('toggle');
                {% elif 'register' in message.tags %}
                    $('#registerModal').modal('toggle');
                {% endif %}
            {% endfor %}
        {% endif %}
    });
</script>