Получение django-ajax_selects для работы в моей форме поиска в Django

Я пытаюсь создать форму поиска, использующую AJAX Select, чтобы при вводе записи в поле отображался раскрывающийся список со списком атрибутов из всех объектов модели, соответствующих введенному тексту. Здесь это соответствующий код:

models.py

class Student(models.Model):
    student_id = models.CharField(max_length=128, unique=True, null=True, blank=True)
    first_name = models.CharField(max_length=128)
    last_name = models.CharField(max_length=128)
    ssn = USSocialSecurityNumberField(null=False)
    gender = models.CharField(max_length=128, choices=GENDER_CHOICES)
    dob = models.DateField(auto_now=False, auto_now_add=False, db_column="date of birth")
    location = models.CharField(max_length=128, choices=LOCATION_CHOICES, default='south_plainfield')

lookups.py

@register('first_name')
class FirstNameLookup(LookupChannel):

    model = Student

    def get_query(self, q, request):
        return self.model.objects.filter(first_name__icontains=q).order_by('first_name')[:50]

    def format_item_display(self, obj):
        return u"<span class='first_name'>%s</span>" % obj.first_name

forms.py

class StudentSearchForm(forms.Form):
    student_id = forms.CharField(max_length=64, required=False, label="Student ID")
    ssn = USSocialSecurityNumberField(widget=forms.TextInput(attrs={'class': 'form-control'}), label="SSN",
                                      help_text="Format: xxx-xx-xxxx", required=False)
    #Pay attention to this
    first_name = AutoCompleteSelectMultipleField('first_name', max_length=128, required=False, label="First Name")
    last_name = forms.CharField(max_length=128, required=False, label="Last Name")
    course = forms.ChoiceField(choices=STUDENT_SEARCH_COURSES, required=False)
    location = forms.ChoiceField(choices=STUDENT_SEARCH_LOCATION_CHOICES, required=False)
    dob = forms.DateField(widget=DateInput(), required=False, label="Date of Birth")
    gender = forms.ChoiceField(choices=STUDENT_SEARCH_GENDER_CHOICES, required=False)

views.py

def search_student(request):
    form = StudentSearchForm()
    if request.method == 'GET' and request.GET != {}:
        form = StudentSearchForm(request.GET)

        if form.is_valid():
            cleaned_form = form.cleaned_data
            student = Student.objects.none()
            for key in cleaned_form:
                value = cleaned_form[key]
                if value == '' or value == None:
                    continue
                else:
                    if student:
                        student = student.filter(**{key: value})
                    else:
                        student = Student.objects.filter(**{key: value})

            table = StudentTable(student)
            RequestConfig(request, paginate={'per_page': 2}).configure(table)
            return render(request, 'students/search_student.html', {'form': form, 'table': table})
        else:
            print(form.errors)

    return render(request, 'students/search_student.html', {'form': form})

search_student.html

<div class="box-body">
    <form id="student_form" method="get" action="/students/search_student/">
        {% csrf_token %}
        <div class="row">
            {% for field in form %}
                <div class="col-lg-3 col-md-3">
                    <div class="form-group">
                        {{ field.errors }}
                        {{ field.label_tag }}
                        <br>
                        {{ field }}
                    </div>
                </div>
            {% endfor %}
        </div>

        <button type="submit" name="submit" class="btn btn-primary btn-lg btn-block">Search</button>
    </form>
</div>

Сейчас я делаю только поле имени. По какой-то причине, когда я захожу в шаблон поиска ученика, я получаю эту ошибку:

Реверс для 'ajax_lookup' с аргументами '()' и аргументами ключевых слов '{'channel': 'first_name'}' не найден. 0 шаблон (ов) пытались: []

Я не уверен, что я делаю неправильно, так как я следовал за документом для django-ajax-select, чтобы сделать мой код. Может ли кто-то пролить свет на это? Благодарю.

РЕДАКТИРОВАТЬ: Кажется, что я получаю эту ошибку, потому что я забыл добавить ajax select в urls.py. Но сам выпадающий не отображается.

РЕДАКТИРОВАТЬ 2: раскрывающийся список теперь работает. Но по какой-то причине он не регистрируется в запросе, когда я пытаюсь выполнить поиск.

1 ответ

Итак, по-видимому, все, что мне нужно было сделать, это изменить AutoCompleteSelectMultipleField на AutoCompleteField, чтобы получить то, что я хочу.

Другие вопросы по тегам