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(),
    )

Для получения более подробной информации смотрите соответствующую документацию, ссылки на которую приведены выше.

Вернуться на верх