[英]Django passing data from one form to another
我可能會搞錯這一切,但我試圖讓一個過濾器集在 Django 中的 forms 之間傳遞,並且沒有快速得到任何地方。 目標是過濾我的 model 中的對象,然后能夠將 email 發送給每個對象所有者。 過濾器正在工作並按預期顯示記錄的子集。 如何將該子集傳遞給另一個視圖。
這是我到目前為止的摘錄...
網址.py
from django.urls import path
from . import views
from blah.views import BlurbListView, SearchResultsView
from blah.filters import BlurbFilter
from django_filters.views import FilterView
from django.urls import path
urlpatterns = [
path('', views.index, name='index'),
path('filter/', views.filter, name='filter'),
path('contact_form/', views.contact_form, name='contact_form'),
]
視圖.py
def filter(request):
blurb_list = Blah.objects.all().order_by('Name')
blurb_filter = BlurbFilter(request.GET, queryset=blurb_list)
context = {
'filter': blurb_filter,
'blurb_list': blurb_list,
}
return render(request,'blah/filter_list.html', context)
def contact_form(request):
blurb_list = request.POST.get('blurb_list')
blurb_filter = BlurbFilter(request.GET, queryset=blurb_list)
for blurb in blurb_list:
print(blurb)
return render(request, 'blah/contact_form.html', { 'blurb_list': blurb_list })
import django_filters
from django_filters import DateRangeFilter, DateFilter, DateTimeFromToRangeFilter
from django_filters.widgets import RangeWidget
from .models import Blah
from django import forms
class BlurbFilter(django_filters.FilterSet):
Name = django_filters.CharFilter(lookup_expr='icontains')
IPADDR = django_filters.CharFilter(lookup_expr='istartswith')
ContactEmail = django_filters.CharFilter(lookup_expr='icontains')
class Meta:
model = Blah
fields = ['Name',
'IPADDR',
'ContactEmail',
]
filter_list.html
{% load render_table from django_tables2 %}
{% load widget_tweaks %}
{% load static %}
<div class="container-fluid" role="main">
<div class="page-header">
<h1>Filter Blurbs</h1>
</div>
{% block content %}
<form method="post" novalidate action="{% url 'contact_form' %}">
{% csrf_token %}
<input type="hidden" name="blurb_list" value="{{ filter }}">
<button type="submit" value="Submit" class="btn btn-primary">Contact Owners</button>
</form>
<form method="get" autocomplete="off" >
{% if request.GET.output_type != "ansible" %}
<input type="radio" id="list" name="output_type" value="list" checked>
{% else %}
<input type="radio" id="list" name="output_type" value="list">
{% endif %}
<label for="list">List</label>
{% if request.GET.output_type == "ansible" %}
<input type="radio" id="ansible" name="output_type" value="ansible" checked>
{% else %}
<input type="radio" id="ansible" name="output_type" value="ansible">
{% endif %}
<label for="ansible">Ansible Inventory</label>
<button type="submit" value="Submit" class="btn btn-primary">Filter</button>
<a href="{% url 'filter' %}" class="btn btn-primary">Reset</a>
<div class="container-fluid">
<div class="row ">
<div class="col-sm">
<label for="id_Name">Blurb Name contains:</label>
{% render_field filter.form.Name class="form-control" %}
</div>
<div class="col-sm">
{{ filter.form.IPADDR.label_tag }}
{% render_field filter.form.IPADDR class="form-control" %}
</div>
<div class="col-sm">
{{ filter.form.ContactEmail.label_tag }}
{% render_field filter.form.ContactEmail class="form-control" %}
</div>
</div>
</div>
</form>
{% if request.GET.output_type != "ansible" %}
<div class="table">
<table class="table w-auto small table-hover">
<thead>
<tr>
<th>Blurb Name</th>
<th>IP Address</th>
<th>Owner</th>
<th>Gather Time</th>
<th>Last Updated</th>
</tr>
</thead>
<tbody>
{% for blurb in filter.qs %}
<tr>
<td><a href="/sysinfo/blurbdetail/{{ blurb.id }}/">{{ blurb.Name }}</a></td>
<td>{{ blurb.IPADDR }}</td>
<td>{{ blurb.ContactEmail }}</td>
<td>{{ blurb.GatherTime|date:"d/m/y H:i:s (e)"}}</td>
<td>{{ blurb.UpdatedTime|date:"d/m/y H:i:s (e)"}}</td>
</tr>
{% empty %}
<tr>
<td class="table-danger" colspan="18" align="center">No Blurbs matching filter</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% else %}
[filtered-hosts]<br>
{% for blurb in filter.qs %}
{{ blurb.Name }} ansible_host={{blurb.Name }} ansible_port=22<br>
{% endfor %}
{% endif %}
{% endblock %}
</div>
</body>
</html>
contact_form.html
{% include "./base.html" %}
{% load render_table from django_tables2 %}
{% load static %}
{% load widget_tweaks %}
<div class="container-fluid" role="main">
<div class="page-header">
<h1>Contact Form</h1>
</div>
{% block content %}
<ul>
{{ blurb_list }}
{% for blurb in blurb_list %}
<li>{{ blurb }} - {{ blurb.Blah }} - {{ blurb.ContactEmail }}
{% endfor %}
</ul>
{% endblock %}
</div>
</body>
</html>
有幾種方法,但我想最簡單的方法是處理直接在視圖(過濾器)中發送的 email。 作為旁注,請使用 CBV。
另一種方法是按照@Chymdy 的建議將數據存儲在數據庫中。
或者,如果您真的需要傳遞數據,請查看 Sessions https://docs.djangoproject.com/en/3.2/topics/http/sessions/ 。
我想到的最后一個是使用 Celery。 在那里編寫一個電子郵件發送函數,將過濾后的數據傳遞給 function。 這里需要知道,不能將 model 實例直接傳遞給 Celery。 意味着您需要提供一個列表,例如 celery function 的主鍵,然后在那里加載對象。
您可以簡單地標記它們。 這不是最好的方法,但是是的,它會起作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.