Использование идентификатора объекта в формах django - PullRequest
0 голосов
/ 23 марта 2020

Почему я не могу получить доступ к идентификатору объекта в def clean(self)? Я получаю сообщение об ошибке:

У объекта 'CheckInForm' нет атрибута 'id' .

forms.py

from django import forms
from .models import Student
from django.core.exceptions import ValidationError


class CheckInForm(forms.ModelForm):
    class Meta:
        model = Student
        fields = ['room', 'name']
        widgets = {'room': forms.TextInput(attrs={'class': 'form-control'}),
                   'name': forms.TextInput(attrs={'class': 'form-control'}),
                   }

    def clean(self):
        cleaned_data = super(CheckInForm, self).clean()
        new_room = cleaned_data.get('room')

        if Student.objects.filter(room=new_room).count() > 3:
            print(Student.objects.filter(room=new_room).count())
            if not Student.objects.filter(room=new_room, id=self.id):
                raise ValidationError('The room is full')

models.py

class Student(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=50, db_index=True)
    room = models.CharField(max_length=8, db_index=True, blank=True)

1 Ответ

1 голос
/ 23 марта 2020

Вы можете использовать self.instance.pk

Я полагаю, вам нужно добавить проверку, если это создать или обновить, прежде чем фильтровать Student с id в вашем clean() методе

def clean(self):
    ...
    if self.instance.pk is not None: # if edit then filter with id
        if not Student.objects.filter(room=new_room, id=self.instance.pk):
            ...

На момент создания еще нет идентификатора. Вы получили идентификатор при обновлении существующей записи.

...