我正在尝试制作一个使用 AJAX Select 的搜索表单,这样当我在字段中输入条目时,将有一个下拉列表,其中包含与输入的文本匹配的所有模型对象的属性列表。这里是相关代码:
模型.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')
查找.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
表格.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)
视图.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>
我现在只做名字字段。出于某种原因,每当我转到搜索学生模板时,我都会收到此错误:
使用参数 '()' 和关键字参数 '{'channel': 'first_name'}' 反转 'ajax_lookup'。尝试了 0 种模式:[]
我不确定我做错了什么,因为我按照 django-ajax-selects 的文档来制作我的代码。有人可以对此有所了解吗?谢谢。
编辑:看来我收到此错误是因为我忘记将 ajax 选择添加到 urls.py 中。但下拉菜单本身并没有出现。
编辑 2:下拉列表现在有效。但是由于某种原因,当我尝试搜索时它没有注册到查询中。