如何在 Django 中创建一个同时为多个用户更新多个字段的表单?

问题描述 投票:0回答:1

我想创建一个能够接受多个响应并更新多个实例的数据库的表单。

这是我的案例: 我有2个型号,会员和现金

class Members(models.Model):
    nim = models.IntegerField(default=0)
    name = models.CharField(max_length=40)
    position = models.CharField(
        max_length=30,
        choices=POSITION_OPTION,
    )
    year = models.IntegerField()
    program = models.CharField(max_length=30)
    potrait = models.CharField(max_length=100, default='NO PHOTO')

class Cash(models.Model):
    name = models.ForeignKey(Members, on_delete=models.CASCADE)
    jan = models.BooleanField(default=False)
    feb = models.BooleanField(default=False)
    mar = models.BooleanField(default=False)
    apr = models.BooleanField(default=False)
    may = models.BooleanField(default=False)
    jun = models.BooleanField(default=False)
    jul = models.BooleanField(default=False)
    aug = models.BooleanField(default=False)
    sep = models.BooleanField(default=False)
    

这个模型背后的逻辑是,每个会员都有自己的现金记录。所以我的最终目标是计算每个会员中 True 的数量,并确定他们存入了多少现金 组织。

回到主题,我想创建一个表单页面,其形式类似于表格,


NIM 一月 二月 所以...
010456 [ ](复选框) [ ](复选框) 所以...
---------- ---------------------------------------- ---------------------------------------- ------------------
010457 [ ](复选框) [ ](复选框) 所以...
                             <button>UPDATE RECORD</button>

但是我一直在想办法如何将这个多个表单同时连接到多个用户。

实现最终目标的另一种方法是为每个用户创建单独的表单页面,但这会破坏创建此表单的目的,即简化组织中的现金系统。

仅此而已,如有任何反馈,我们将不胜感激。谢谢你

python django database sqlite django-forms
1个回答
0
投票

我可以建议使用

Formsets
,即
modelformset
_factory方法。在这里,我为 Cash 模型创建了一个 CashFormSet。
form
模板显示所有条目。您标记您需要的并单击
update
按钮。

检查“POST”方法并验证后,数据将被保存。发生数据聚合,nim、count 显示在

base1
模板中。

文档:表单集

文档:modelformset_factory

views.py

from django.forms import modelformset_factory
from django.db.models import Count, Q

def form(request):
    CashFormSet = modelformset_factory(Cash, fields='__all__', extra=0)
    if request.method == 'POST':
        form = CashFormSet(request.POST)
        if form.is_valid():
            form.save()
            memcash = (Members.objects.annotate
                (
                cnt=Count('cash', filter=Q(cash__jan=True)) +
                    Count('cash', filter=Q(cash__feb=True)) +
                    Count('cash', filter=Q(cash__mar=True)) +
                    Count('cash', filter=Q(cash__apr=True)) +
                    Count('cash', filter=Q(cash__may=True)) +
                    Count('cash', filter=Q(cash__jun=True)) +
                    Count('cash', filter=Q(cash__jul=True)) +
                    Count('cash', filter=Q(cash__aug=True)) +
                    Count('cash', filter=Q(cash__sep=True))
            ))

            return render(request, 'base1.html', {'memcash': memcash})
    else:
        form = CashFormSet()

    return render(request, 'form.html', {'form': form})

form.html

<form method='post' action=''>
    {% csrf_token %}
    {{ form.management_form }}
    {% for field in form %}

    <p>{{ field }}</p>

    {% endfor %}

    <button type='submit'>update</button>
</form>

base1.html

{% for field in memcash %}

<p>{{ 'nim' }} : {{ field.nim }} {{ 'count' }} : {{ field.cnt }}</p>

{% endfor %}
© www.soinside.com 2019 - 2024. All rights reserved.