Django Forms - Как мне реализовать форму, которая динамически изменяет свои поля в зависимости от объектов модели в базе данных?
У меня есть 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()
В моей базе данных есть несколько различных объектов сертификации, но в будущем их станет больше.
Моя модель ActiveCertification используется для определения того, какой пользователь имеет какой сертификат.
Теперь, проблема, с которой я столкнулся, заключается в том, что я хочу, чтобы каждый пользователь мог заполнить в форме, какие сертификаты у него есть. В основном мне нужно, чтобы форма выглядела следующим образом :
Certification 1 [ ]
Certification 2 [ ]
Certification 3 [ ]
Certification 4 [ ]
ect...
[ Submit ]
([ ] представляет собой флажок)
В принципе, мне нужно, чтобы когда пользователь A использует эту форму, он проверял сертификаты, которые у него есть, и чтобы после отправки таблица ActiveCertification заполняла/обновляла пары 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, но это не работает, так как получается выпадающий список, а мне нужен список с флажками.
Любая помощь будет очень признательна. Заранее спасибо !
Есть две возможности:
модельные наборы форм и использование forms.ModelMultipleChoiceField с виджетом 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)
ModelMultipleChoiceField
from django import forms
class CertificationForm(forms.Form):
certifications = forms.ModelMultipleChoiceField(
widget=forms.CheckBoxSelectMultiple(),
)
Для получения более подробной информации смотрите соответствующую документацию, ссылки на которую приведены выше.