django - 使用嵌套模式时如何区分模板中的 Django 消息?
问题描述
所以,我已经为此绞尽脑汁两天了。任何帮助都是极好的!
我相信,我的问题的核心是我在两者中都有嵌套模式和自定义引导表单:第一个用于登录,第二个用于注册。假设在一种情况下,我想在服务器端进行所有验证,并且可能完全控制每条错误验证消息,以及它们在输入中的显示方式和位置。我如何使用 django.contrib.messages 做到这一点?
** 如果我可以使用 Bootstrap 4 的一些内置验证方法作为第一道防线,或者像使用 Zurb Foundation 的 Abide 一样使用data-validate-on-blur来工作,那就更好了。
每个 base.html 模态中的模板标签:
{% 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 %}
迄今为止的考验和磨难:
就目前而言,以及我在 Stack Overflow 上找到的各种解决方法,即使用 jQuery 切换模式(不是最漂亮的,因为它重新加载页面),我所能做的最好的仍然让我的消息流血在模态和/或我的重定向视图之间。
我已经阅读了有关如何清除 Django 消息的线程,并认为这可能是一个修复,所以如果在我关闭一个模式或打开一个新模式之后,这些消息基本上会被清除,直到再次提交表单。换句话说,当它的表单的提交按钮被按下时,登录错误消息对于登录模式是唯一的,而当它的表单的提交按钮被按下时,注册错误消息对于注册模式是唯一的。
不幸的是,我还没有弄清楚如何使用视图(views.py)来成功实现这一点。想到这个想法,因为因为我使用模态来触发该事件,所以我必须为此使用 jQuery,但我在这方面也失败了。我真的希望有一个更直接的解决方案。
提前致谢,
开发
PS - 我的片段:
视图.py
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')
模型.py
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
base.html 中的登录模式
<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>×</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>
在 base.html 中注册模态
<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>×</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>
PSS - 如果我可以帮助澄清其他任何事情,请告诉我
解决方案
好吧,我认为我解决了自己的问题,并且不知何故不得不与他人分享解决方案,因为我认为我实际上为此失眠了。无论如何,我不确定这是否是 Django 消息类的“ extra_tags ”属性最初的用途,但出于所有意图和目的,它是一个干净的修复,允许我控制服务器端和客户端验证消息。
首先,当我创建和附加每个消息实例时,我分别将extra_tags分配给“注册”和“登录”:
视图.py
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('/')
我检查是否有消息,然后遍历它们,检查标签是否为“注册”(或“登录”),如果是,则呈现一些文本,如果没有,则不呈现任何内容。
base.html
{% 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 %}
最后但同样重要的是,在您通过任一模式提交表单后,您将需要使用上述错误(或成功)消息重新加载模式。要让每个模式显示其各自的消息,您必须区分然后切换以打开每个模式,就像我在 base.html 中使用template_tags一样,只是这次使用了一点 jQuery:
<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>
推荐阅读
- r - 有没有人可以使用 R 解释基本正则表达式的结果?
- android - java.lang.IllegalStateException: DataBindingUtil.inflate
(...) 在尝试使用 DataBindingUtil 膨胀时不能为空 - javascript - 将两个数组传递给函数,使用数据来启动按钮按下。Javascript
- laravel - Laravel - 没有一些数据的递归关系
- javascript - 当我尝试应用动态 css 大小属性时,应用程序渲染大于视口
- php - 在 PHP 中添加被覆盖的超链接
- android - 我的 Java 函数中的 2 行不想在 Android 应用程序中执行
- java - 正则表达式查找具有条件的子字符串
- java - Domino 9 FP10 xpages 外部 JAR
- android - 即使在 EditText 获得焦点后也显示对话框全屏