django - 在不使用 django-forms 的情况下从 django 中的表中获取复选框项目列表
问题描述
在这里我有一个表,有一个复选框,我想向该表的所有检查数据发送电子邮件。为此,我尝试了以下方法。但它不起作用。问题是在返回检查项目列表时。被检查的项目不会被退回。如何解决?
模板
<tbody>
{% for contact in contacts %}
<tr>
<td>
<input name ="messages" type="checkbox"
id="contact-{{contact.id}}" value={{contact.id}}">
<label for="contact-{{contact.id}}">{{ forloop.counter }}</label>
</td>
<td>{{ contact.name }}</td>
<td>{{ contact.email }}</td>
<td>{{ contact.subject }}</td>
<td>{{ contact.message }}</td>
</tr>
{% endfor %}
</tbody>
//modal
<button class="btn btn-primary send-mail-to-selected-btn" type="button"
data-toggle="modal" data-target="#item-unit-modal1">
Send Mail To Selected Email
</button>
<div class="modal" id="item-unit-modal1">
<div class="modal-body">
<form method="POST" action="{% url 'admin:send_mail_selected_contact' %}" class="unit-ajax-form">
{% csrf_token %}
<p><label>Subject</label> <input type="text" name="subject" class="form-control required" placeholder="Enter subject" ></p>
<p><label>Message</label> <textarea name="message" class="form-control required" placeholder="Enter message" ></textarea></p>
<button class="btn btn-primary mt-30">Send Mail</button>
</form>
</div>
视图.py
def send_mail_selected_contact(request):
selected_contact = ContactForm.objects.filter(id__in=request.POST.getlist('messages'))
print(selected_contact)
form = SendMailContact(request.POST or None)
if form.is_valid():
subject = form.cleaned_data['subject']
message = form.cleaned_data['message']
for contact in selected_contact:
send_mail(subject, message, ' <settings.EMAIL_HOST_USER>', [contact.email])
messages.success(request, 'Mail Sent')
return redirect('admin:contact_message')
阿贾克斯
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
<script>
$(document).on('click', '.send-mail-to-selected-btn', function(){
var messages = new Array();
$("input:checked").each(function() {
messages.push($(this).val());
});
console.log(messages); #here i can see the id of checked email
});
$.ajax({
url:'admin/selected/send/mail/contact/',
data:{
name: name,
messages: messages,
}
});
</script>
表格.py
class SendMailContact(forms.Form):
subject = forms.CharField(max_length=250)
message = forms.CharField(widget=forms.Textarea)
解决方案
您需要将ajax
呼叫移动到点击处理程序中。
此外,由于您正在侦听单击而不是提交事件,因此您无法阻止浏览器也提交该表单。请参阅下面的更新实现,它会监听提交,取消浏览器的默认行为,并在提交时进行 AJAX 调用。
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
<script>
$(document).on('submit', '.send-mail-to-selected-btn', function(ev){
ev.preventDefault()
var messages = new Array();
$("input:checked").each(function() {
messages.push($(this).val());
});
console.log(messages); #here i can see the id of checked email
$.ajax({
url:'admin/selected/send/mail/contact/',
data:{
name: name,
messages: messages,
}
});
});
</script>
推荐阅读
- vba - 循环侧的 Dlookup 可能吗?
- amazon-web-services - AWS 上的响应缓存中间件和负载平衡
- heroku - 将 Laravel 与 Sanctum 部署到 Heroku - CSRF 令牌不匹配
- c++ - 如何给出 std::pairs 的 Std::Vector 的默认参数?
- android - 上传有效的 APK
- python - 使用 Flask 实现模态表单
- python - 如何防止过拟合
- angular-material - 将 cdk Overlay 定位在鼠标位置
- javascript - React 渲染箭头函数性能
- php - WooCommerce 根据产品类别替换购物车/结帐中的“延期交货可用”