Форма не проверяется, если составной первичный ключ уже используется - PullRequest
0 голосов
/ 17 декабря 2018

Я сейчас пробую свой первый проект Django и столкнулся с проблемой того, что мое приложение странно реагирует, когда я пытаюсь создать объект с дублированными составными первичными ключами.Следующая стартовая ситуация:
Чтобы иметь возможность четко определить свой результат, я использую составной первичный ключ, состоящий из уникального идентификатора студента (matriculation_number) и уникального идентификатора экзамена (exam_id).Вот соответствующая модель в моем файле models.py:

class Result(models.Model):

    # No student should be able to be deleted as long as there are still results to show.
    matriculation_number = models.ForeignKey(Student, on_delete=models.PROTECT, verbose_name='Matrikelnummer')
    # No student should be able to be deleted as long as there are still results to show.
    exam_id = models.ForeignKey(Exam, on_delete=models.PROTECT, verbose_name='Prüfungsnummer')
    grade = models.DecimalField(max_digits=3, decimal_places=2, default=None,
                                validators=[MaxValueValidator(6), MinValueValidator(1)],
                                verbose_name='Note')

    # Workaround for composite primary-key
    # Get Data using Result.objects.get(matriculation_number=”10”,exam_id=”125”)
    class Meta:
        unique_together = (('matriculation_number', 'exam_id'),)
        verbose_name = 'Ergebnis'
        verbose_name_plural = 'Ergebnisse'

Чтобы вообще получить составной первичный ключ, я использую обходной путь с unique_together.Следующие части views.py и forms.py также принадлежат ему:
views.py

class ResultCreateView(generic.CreateView):
    form_class = CreateResultForm
    template_name = 'studentmanager/result/result_create_form.html'
    success_url = reverse_lazy('studentmanager:result')

forms.py

class CreateResultForm(forms.ModelForm):
    class Meta:
        model = Result
        fields = ['exam_id', 'matriculation_number', 'grade']
        widgets = {
            'exam_id': forms.Select(choices=Exam.objects.all(), attrs={'class': 'form-control'}),
            'matriculation_number': forms.Select(choices=Student.objects.all(), attrs={'class': 'form-control'}),
            'grade': forms.NumberInput(attrs={'class': 'form-control'})
        }

Если я сейчас создам совершенно новый результат, все работает безупречно.Но если я попытаюсь ввести новый балл для того же студента и того же экзамена, запрос POST будет запущен с кодом 200, но я не буду перенаправлен на мой success_url, и данные также не будут обновлены.Даже ошибка не появляется.Я ожидал бы, что форма покажет мне ошибку, указывающую, что для выбранной комбинации уже существует запись.
Как я могу реализовать такую ​​проверку, которая предотвращает создание дублирующих новых записей для существующих составных ключей, но соответствующуюошибка уже появляется в виде?

...