Нахождение фамилии в базе данных - PullRequest
0 голосов
/ 05 ноября 2019

Я пытаюсь написать простой оператор IF для проверки, существует ли фамилия в базе данных, прежде чем пользователь нажмет кнопку отправки для создания новой записи. Вот мой код, я новичок в Django и Python, поэтому помощь приветствуется.

Я создал переменную с именем lastname, здесь мыслительный процесс, когда пользователь нажимает submit, сначала он проверяет базу данныхперед фиксацией, чтобы предупредить их всплывающим окном, если фамилия существует для предотвращения дублирования записей. Было бы действительно здорово иметь его, когда человек покидает поле, чтобы запустить скрипт, прежде чем он закончит заполнение формы, чтобы сэкономить время.

#views.py

from .models import StudentCheck
from django.shortcuts import render
from django.http import HttpResponse, Http404, HttpResponseRedirect
from forms.forms import NewStudentForm


def NewStudentFormCheckList (request):
    if request.method == 'POST':
        form = NewStudentForm(request.POST) 
        lastname = StudentCheck.lastname
        if form.is_valid():
            newstudent= form.save()


    else:
        form = NewStudentForm()    

    return render(request, 'forms/newstudentcheck_form.html', {'form': form})

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


from .models import StudentCheck
from django.core.exceptions import ValidationError
from django.shortcuts import render
from django.http import HttpResponse, Http404, HttpResponseRedirect
from forms.forms import NewStudentForm


def NewStudentFormCheckList (request):
     if request.method == 'POST':
        form = NewStudentForm(request.POST) 
        lastname = StudentCheck.lastname
        number_lastnames = StudentCheck.objects.get(lastname__exact=lastname)


        if form.is_valid():
            newstudent= form.save()
            print (number_lastnames)

     else:
        form = NewStudentForm()    

     return render(request, 'forms/newstudentcheck_form.html', {'form': form})

1 Ответ

0 голосов
/ 05 ноября 2019

Вы можете получить все записи в базе данных, для которых заданное значение уже установлено, используя поле поиска exact (см. здесь для получения дополнительной информации).

В вашем случае этобудет StudentCheck.objects.get(lastname__exact=yourvalue). Это даст вам QuerySet, и если вы хотите узнать, сколько записей имеет заданную фамилию, вы должны использовать count() для этого QuerySet, чтобы узнать, сколько у него записей.

Вы можете использовать это решение в двух разных местах:

  1. Непосредственно в представлении при получении значений POST.
  2. В пользовательском валидаторе, который будет использоваться в определениимодель (см. здесь , чтобы узнать, как это сделать)

Я бы порекомендовал использовать вторую, так как было бы проще предоставить пользователю пользовательскую информацию о том, почему это данныегде не принято.

Оба эти метода требуют, чтобы данные были переданы на сервер для проверки. В противном случае вы можете определить представление, которое получит фамилию и вернет, если оно каким-то образом уже присутствует в базе данных (например, JSON), которое будет вызываться с использованием Ajax, когда пользователь нажимает кнопку отправки.

Редактировать :

В соответствии с запросом OP, вот пример настраиваемого валидатора:

from django.core.exceptions import ValidationError
from .models import StudentCheck

def validate_lastname(value):
    number_lastnames = StudentCheck.objects.get(lastname__exact=value)
    if number_lastnames > 0:
        raise ValidationError(
            '%s already exists' % value,
        )

Теперь вы можете использовать этот настраиваемый валидатор с атрибутом validators,либо в определении вашей модели, либо в определении вашей формы, например: lastname = models.CharField(validators=[validate_lastname]).

Надеюсь, это поможет!

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