Установите ограничение для форм с одинаковым значением Django
Итак, что я хочу сделать, так это установить предел форм с одинаковым значением. Есть различные виды деятельности из иностранной модели, на которые студенты могут подавать заявки. У меня есть имя(naam), номер студента(studentnummer), деятельность(activiteit) и класс(klas), и я хочу установить ограничение на 10 форм с одинаковой деятельностью (максимум людей, которые могут заниматься одной деятельностью) и ограничение на 1 для номера студента (чтобы студенты могли подавать заявки только на одну деятельность).
models.py
class Klas(models.Model):
klas = models.CharField(max_length=8)
def __str__(self):
return f"{self.klas}"
class Activiteit(models.Model):
titel = CharField(max_length=64)
docent = CharField(max_length=32)
icon = models.ImageField()
uitleg = models.TextField()
def __str__(self):
return f"{self.id}:{self.titel}:{self.docent}"
class Aanmelden(models.Model):
naam = CharField(max_length=32)
studentnummer = IntegerField()
klas = ForeignKey(Klas, on_delete=models.CASCADE, default=None, blank=True)
activiteit = ForeignKey(Activiteit, on_delete=models.CASCADE, default=None, blank=True)
def __str__(self):
return f"{self.id}:{self.naam}:{self.studentnummer}"
views.py
def home(request):
activiteiten = Activiteit.objects.all()
form = AanmeldenForm()
if request.method == 'POST':
form = AanmeldenForm(request.POST)
if form.is_valid():
form.save()
return render(request, 'home.html', {
'activiteiten': activiteiten,
'form':form,
})
forms.py
class AanmeldenForm(forms.ModelForm):
class Meta:
model = Aanmelden
fields = (
'naam','studentnummer','klas','activiteit'
)
Если вы знаете, как это решить или у вас есть лучшая идея, как сделать такую систему, пожалуйста, дайте мне знать. Заранее спасибо!!!
Вероятно, вам нужно иметь переменную внутри класса Aktiviteit
, такую как plaatsen_beschikbaar
, которая инициализируется на 10 при создании нового экземпляра Aktiviteit
. Затем при успешном Aanmelden
экземпляра вы уменьшаете ее на единицу. Вам нужно убедиться, что в вашей модели plaatsen_beschikbaar
не может быть меньше нуля, и если кто-то удаляет аанмелдинг, то увеличивает переменную на 1. Редактирование: или вы используете валидатор, такой как приведенный ниже, для ограничения аанмелдинга. Вы также можете сделать так, чтобы ваша модель имела @свойство, которое возвращает plaatsen_beschikbaar
вместо использования поля. Если подумать, то это кажется лучшим планом, отсюда и эта правка
Чтобы убедиться, что у студента может быть только 1 Aanmelden
, вы можете просто сделать studentnummer
уникальным в классе Aanmelden
. Но это делает вашу модель не перспективной, если в будущем вы решите, что студенты могут подписаться на два или три вида деятельности. В этом случае вам необходимо иметь связь внешнего ключа с Student
и ограничить количество Aanmelden
, которое может иметь студент, используя валидатор, например, так
def beperk_aanmelden(value):
if Aanmelden.objects.filter(student_id=value).count() >= 1:
raise ValidationError('Student heeft al de maximale aanmeldingen')
Тогда в вашей Aanmelden
модели:
student = ForeignKey(Student, validators=[beperk_aanmelden,]