Форма Джанго: Проверьте уникальное имя - PullRequest
0 голосов
/ 25 мая 2018

В своей форме я хочу проверить, является ли имя дескриптора уникальным для этого проекта.

Models.py

class Descriptor (models.Model):
    project = models.ForeignKey('Project', on_delete=models.CASCADE, default='1')
    name = models.CharField(max_length=1000)

forms.py

class DescriptorForm(forms.ModelForm):
    class Meta:
        model = Descriptor
        fields = ('name','project')
        widgets = {'project': forms.HiddenInput()}

    def clean_name(self):
        name = self.cleaned_data['name']
        project = self.fields['project']
        if Descriptor.objects.filter(project=project, name__iexact=name).exists():
            raise ValidationError("Descriptor with this name already exists")
        return name

Я получаю

TypeError: int() argument must be a string, a bytes-like object or a number, not
 'ModelChoiceField'

Без project = self.fields['project'] и project=projectПроверка работает, но для всех дескрипторов, а не только для тех, которые связаны с этим проектом.Что я должен изменить, чтобы сделать эту работу?

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Если вы можете изменить свою модель, вы можете использовать атрибут unique_together Meta для проверки уникальности.

class Descriptor (models.Model):
    project = models.ForeignKey('Project', on_delete=models.CASCADE, default='1')
    name = models.CharField(max_length=1000)

    class Meta:
        unique_together = (
            ('project', 'name'),
        )

И с этим ваша форма будет уменьшенана:

class DescriptorForm(forms.ModelForm):
    class Meta:
        model = Descriptor
        fields = ('project', 'name')
        widgets = {
            'project': forms.HiddenInput(),
        }

С (важной) стороны нет: вы должны НЕ использовать default='1' в своем ForeignKey, потому что он ожидает экземпляр Project,не строка.

0 голосов
/ 25 мая 2018

Вместо fields вы должны использовать cleaned_data, чтобы получить project значение внутри clean_name метода, а также изменить порядок полей, чтобы сделать проект доступным во время проверки имени:

class DescriptorForm(forms.ModelForm):
    class Meta:
        model = Descriptor
        fields = ('project', 'name')
        widgets = {'project': forms.HiddenInput()}

    def clean_name(self):
        name = self.cleaned_data['name']
        project = self.cleaned_data['project']
        if Descriptor.objects.filter(project=project, name__iexact=name).exists():
            raise ValidationError("Descriptor with this name already exists")
        return name

self.fields['project']вернуть сам класс поля, а не его значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...