So I am trying to use autocomplete-light 3.1.8 and following this tutorial. Now I have a model called "Equipment" with a many-to-many field "used_for_tests". Following the tutorial, I set the following code up but had this no reverse match error. This happens when I tried to add a new equipment
in models.py:
class Equipment(models.Model):
asset_number = models.CharField(max_length = 200, null=True, unique = True)
used_for_test = models.ManyToManyField(Tests)
class EquipmentForm(ModelForm):
helper = FormHelper()
helper.layout = Layout(
Div(
Div('asset_number',
css_class='col-sm-4'),
Div(
'used_for_test',
ButtonHolder(
Submit('save', 'Save')
), css_class='col-sm-4'),
css_class='row-fluid'),
)
class Meta:
model = Equipment
fields = ['asset_number', 'used_for_test']
widgets = {'used_for_test': autocomplete.ModelSelect2Multiple(url='tests')
}
)
urls.py:
url(
r'^tests-autocomplete/$',
TestsAutocomplete.as_view(),
name='tests',
),
views.py:
class TestsAutocomplete(autocomplete.Select2QuerySetView):
def get_queryset(self):
# Don't forget to filter out results depending on the visitor !
if not self.request.user.is_authenticated():
return Tests.objects.none()
qs = Tests.objects.all()
if self.q:
qs = qs.filter(name__istartswith=self.q)
return qs
equipment_add.html:
{% extends 'calbase/default.html' %}
{% load staticfiles %}
{% load crispy_forms_tags %}
{% block content %}
<div class="container-fluid">
<div class="row">
<div class="col-sm-3 col-md-2 sidebar">
<ul class="nav nav-sidebar">
<li><a href="/calbase">Overview <span class="sr-only">(current)</span></a></li>
<li class="active"><a href="{% url 'calbase:default_new' %}" >New</a></li>
</ul>
</div>
<div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main">
<h1>Edit</h1>
{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}
{% include "calbase/messages_display.html" %}
<div class="row">
<!-- /.col-lg-8 -->
<div class="col-xs-12 col-sm-6 col-md-8">
<div class="panel panel-primary">
<div class="panel-heading">
Equipment Detail
</div>
<div class="panel-body">
<form method='POST' action='' enctype='multipart/form-data'>{% csrf_token %}
{% crispy form %}
</form>
</div>
</div>
<!-- <input type='submit' class='btn btn-default' /> -->
</div>
</div>
</div>
</div>
{% endblock %}
Environment:
Request Method: GET
Request URL: http://127.0.0.1:8000/calbase/equipment/new/
Django Version: 1.10
Python Version: 3.5.2
Installed Applications:
['calbase.apps.CalbaseConfig',
'dal',
'dal_select2',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'haystack',
'whoosh',
'carton',
'adminplus',
'django.contrib.admin.apps.SimpleAdminConfig',
'crispy_forms',
'auditlog']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'auditlog.middleware.AuditlogMiddleware']
Template error:
In template C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\crispy_forms\templates\bootstrap3\field.html, error at line 28
Reverse for 'tests' with arguments '()' and keyword arguments '{}' not found. 0 pattern(s) tried: [] 18 :
19 : {% if field|is_checkboxselectmultiple %}
20 : {% include 'bootstrap3/layout/checkboxselectmultiple.html' %}
21 : {% endif %}
22 :
23 : {% if field|is_radioselect %}
24 : {% include 'bootstrap3/layout/radioselect.html' %}
25 : {% endif %}
26 :
27 : {% if not field|is_checkboxselectmultiple and not field|is_radioselect %}
28 : {% if field|is_checkbox and form_show_labels %}
29 : <label for="{{ field.id_for_label }}" class="{% if field.field.required %} requiredField{% endif %}">
30 : {% crispy_field field %}
31 : {{ field.label|safe }}
32 : {% include 'bootstrap3/layout/help_text_and_errors.html' %}
33 : </label>
34 : {% else %}
35 : <div class="controls {{ field_class }}">
36 : {% crispy_field field %}
37 : {% include 'bootstrap3/layout/help_text_and_errors.html' %}
38 : </div>
Traceback:
File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\core\handlers\exception.py" in inner
39. response = get_response(request)
File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\core\handlers\base.py" in _get_response
187. response = self.process_exception_by_middleware(e, request)
File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\core\handlers\base.py" in _get_response
185. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\contrib\auth\decorators.py" in _wrapped_view
23. return view_func(request, *args, **kwargs)
File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\contrib\auth\decorators.py" in _wrapped_view
23. return view_func(request, *args, **kwargs)
File "C:\Users\hansong.li\Documents\GitHub\equipCal\calbase\views.py" in default_new
103. return render(request, 'calbase/default_add.html', {'form':form})
File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\shortcuts.py" in render
30. content = loader.render_to_string(template_name, context, request, using=using)
File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\loader.py" in render_to_string
68. return template.render(context, request)
File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\backends\django.py" in render
66. return self.template.render(context)
File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\base.py" in render
208. return self._render(context)
File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\base.py" in _render
199. return self.nodelist.render(context)
File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\base.py" in render
994. bit = node.render_annotated(context)
File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\base.py" in render_annotated
961. return self.render(context)
File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\loader_tags.py" in render
174. return compiled_parent._render(context)
File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\base.py" in _render
199. return self.nodelist.render(context)
File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\base.py" in render
994. bit = node.render_annotated(context)
File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\base.py" in render_annotated
961. return self.render(context)
File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\loader_tags.py" in render
70. result = block.nodelist.render(context)
File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\base.py" in render
994. bit = node.render_annotated(context)
File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\base.py" in render_annotated
961. return self.render(context)
File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\crispy_forms\templatetags\crispy_forms_tags.py" in render
214. c = self.get_render(context)
File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\crispy_forms\templatetags\crispy_forms_tags.py" in get_render
133. actual_form.form_html = helper.render_layout(actual_form, node_context, template_pack=self.template_pack)
File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\crispy_forms\helper.py" in render_layout
297. template_pack=template_pack
File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\crispy_forms\layout.py" in render
138. return self.get_rendered_fields(form, form_style, context, template_pack, **kwargs)
File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\crispy_forms\layout.py" in get_rendered_fields
102. for field in self.fields
File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\crispy_forms\layout.py" in <genexpr>
102. for field in self.fields
File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\crispy_forms\utils.py" in render_field
73. form, form_style, context, template_pack=template_pack,
File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\crispy_forms\layout.py" in render
358. fields = self.get_rendered_fields(form, form_style, context, template_pack, **kwargs)
File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\crispy_forms\layout.py" in get_rendered_fields
102. for field in self.fields
File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\crispy_forms\layout.py" in <genexpr>
102. for field in self.fields
File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\crispy_forms\utils.py" in render_field
73. form, form_style, context, template_pack=template_pack,
File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\crispy_forms\layout.py" in render
358. fields = self.get_rendered_fields(form, form_style, context, template_pack, **kwargs)
File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\crispy_forms\layout.py" in get_rendered_fields
102. for field in self.fields
File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\crispy_forms\layout.py" in <genexpr>
102. for field in self.fields
File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\crispy_forms\utils.py" in render_field
162. html = template.render(context)
File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\backends\django.py" in render
66. return self.template.render(context)
File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\base.py" in render
208. return self._render(context)
File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\base.py" in _render
199. return self.nodelist.render(context)
File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\base.py" in render
994. bit = node.render_annotated(context)
File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\base.py" in render_annotated
961. return self.render(context)
File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\defaulttags.py" in render
323. return nodelist.render(context)
File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\base.py" in render
994. bit = node.render_annotated(context)
File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\base.py" in render_annotated
961. return self.render(context)
File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\defaulttags.py" in render
323. return nodelist.render(context)
File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\base.py" in render
994. bit = node.render_annotated(context)
File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\base.py" in render_annotated
961. return self.render(context)
File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\defaulttags.py" in render
323. return nodelist.render(context)
File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\base.py" in render
997. bits.append(force_text(bit))
File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\utils\encoding.py" in force_text
76. s = six.text_type(s)
File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\utils\html.py" in <lambda>
391. klass.__str__ = lambda self: mark_safe(klass_str(self))
File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\forms\boundfield.py" in __str__
43. return self.as_widget()
File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\forms\boundfield.py" in as_widget
101. return force_text(widget.render(name, self.value(), attrs=attrs))
File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\forms\widgets.py" in render
598. final_attrs = self.build_attrs(attrs, name=name)
File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\dal\widgets.py" in build_attrs
42. if self.url is not None:
File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\dal\widgets.py" in _get_url
91. return reverse(self._url)
File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\urls\base.py" in reverse
91. return force_text(iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs)))
File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\urls\resolvers.py" in _reverse_with_prefix
389. (lookup_view_s, args, kwargs, len(patterns), patterns)
Exception Type: NoReverseMatch at /calbase/equipment/new/
Exception Value: Reverse for 'tests' with arguments '()' and keyword arguments '{}' not found. 0 pattern(s) tried: []
But as showed here, in models it points to "tests" and that's right the name I gave in urls. Why there is a no reverse match problem?
Also, the "Using autocompletes outside the admin" part in the tutorial is confusing.
{% block footer %}
<script type="text/javascript" src="/static/collected/admin/js/vendor/jquery/jquery.js"></script>
{{ form.media }}
what are those for?
Thanks guys