我想创建一个能够接受多个响应并更新多个实例的数据库的表单。
这是我的案例: 我有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>
但是我一直在想办法如何将这个多个表单同时连接到多个用户。
实现最终目标的另一种方法是为每个用户创建单独的表单页面,但这会破坏创建此表单的目的,即简化组织中的现金系统。
仅此而已,如有任何反馈,我们将不胜感激。谢谢你
我可以建议使用
Formsets
,即modelformset
_factory方法。在这里,我为 Cash 模型创建了一个 CashFormSet。 form
模板显示所有条目。您标记您需要的并单击 update
按钮。
检查“POST”方法并验证后,数据将被保存。发生数据聚合,nim、count 显示在
base1
模板中。
文档:表单集
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 %}