簡體   English   中英

Django 將數據從一種形式傳遞到另一種形式

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM