Django Forms - 我将如何实现根据数据库中的模型对象动态更改其字段的表单?

Django Forms - How would I implement a form that dynamically changes its fields depending on model objects in the database?

我有 3 个模型:

from django.db import models
from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    pass

class Certification(models.Model):
    def __str__(self):
        return f'{self.name}'
    name = models.CharField(max_length=30)
    shortName = models.CharField(max_length=10)
    score = models.IntegerField(null=True, blank=True)


class ActiveCertification(models.Model):
    def __str__(self):
        return f'{self.user} | {self.sensor}'
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    certification = models.ForeignKey(Certification, on_delete=models.CASCADE)
    value = models.BooleanField()

在我的数据库中,有一些不同的 Certification 对象,但将来肯定会更多。

我的 ActiveCertification 模型用于识别哪个用户拥有哪个证书。

现在,我面临的问题是我希望每个用户都可以在表格中填写他们拥有的证书。我基本上需要这样的表格:

Certification 1 [ ]
Certification 2 [ ]
Certification 3 [ ]
Certification 4 [ ]
ect...
[ Submit ]

[ ]代表一个复选框)

基本上,我需要当用户 A 使用此表单时,他检查他拥有的证书,并且在提交时,ActiveCertification table 将 fill/update userA/certification 对。

起初,我开始做这样的表格:

from django import forms

class ActiveCertificationForm(forms.Form):
    certification1 = forms.BooleanField(required=False)
    certification2 = forms.BooleanField(required=False)
    certification3 = forms.BooleanField(required=False)
    certification4 = forms.BooleanField(required=False)

但很快意识到这是一个糟糕的解决方案,因为当新的认证被添加到数据库时,表格不会自动更新。

我尝试在 Django 文档中寻求帮助,并尝试使用 ModelChoiceField 字段实现表单,但它并没有真正起作用,因为它会生成一个下拉列表,而我需要一个复选框列表。

如有任何帮助,我们将不胜感激。提前致谢!

有两种可能:

model formsets and using a forms.ModelMultipleChoiceField with a CheckBoxSelectMultiple 小部件。

表单集

forms.py:

from django.forms import modelformset_factory

from yourapp.models import ActiveCertification


ActiveCertificationFormSet = modelformset_factory(ActiveCertification, fields=('certification', 'value',))

views.py

from django.shortcuts import render
from yourapp.forms import ActiveCertificationFormSet
from yourapp.models import ActiveCertification

def your_view(request, *args, **kwargs):
    active_certs = ActiveCertivication.objects.filter(user=request.user)
    context = {
        'certification_formset': ActiveCertificationFormSet(
            queryset=active_certs,
        ),
    }
    return render(request, 'certification_template.html', context)

模型多选字段

from django import forms

class CertificationForm(forms.Form):
    certifications = forms.ModelMultipleChoiceField(
        widget=forms.CheckBoxSelectMultiple(),
    )

有关详细信息,请参阅上面链接的相应文档。