django-autocomplete-light zeigt ein leeres Dropdown-Menü im Formular an

Lesezeit: 4 Minuten

Benutzer-Avatar
Ilja Bibik

Ich versuche, django-autocomplete-light aus diesem Tutorial zu verwenden
https://github.com/yourlabs/django-autocomplete-light/blob/master/docs/tutorial.rst

Ich habe es mit Pip installiert und zu meiner Einstellungsdatei hinzugefügt

INSTALLED_APPS = (
    'dal',
    'dal_select2',

für meinen Mietwert

Mein Mietermodell ist

class Tenant(CommonInfo):
    version = IntegerVersionField( )

    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=40)
    def __unicode__(self):
        return u'%s %s %s ' % ("#", self.id,"first_name", self.first_name, "last_name")

In meiner Autocomplete-Ansicht:

from django.shortcuts import render
from dal import autocomplete
from client.models import Tenant


    class TenantAutocomplete(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 Tenant.objects.none()

            qs = Tenant.objects.all()

            if self.q:
                qs = qs.filter(last_name__istartswith=self.q)

            return qs

in Autocomplete-URL

from django.conf.urls import url, include,patterns
from client import views 

    urlpatterns = [
        url(
            r'^tenant-autocomplete/$',
            views.TenantAutocomplete.as_view(),
            name="tenant-autocomplete",
        ), 
    ]

und formschön

class LeaseTenantForm(forms.ModelForm):
    tenant = forms.ModelChoiceField(
        queryset=LeaseTenant.objects.all(),
        widget=autocomplete.ModelSelect2(url="tenant-autocomplete")
        )
    class Meta:
        model = LeaseTenant
        exclude = ['lease']

Nach dem Rendern im Browser sehe ich jedoch nicht das Eingabetextfeld, sondern die leere Dropdown-Liste. in echter Sicht

def tenant_new(request,pk,uri):
    lease = get_object_or_404(Lease, pk=pk)
    title="tenant"
    uri = _get_redirect_url(request, uri)
    if request.method == "POST":
        form = LeaseTenantForm(request.POST)
        if form.is_valid():
            tenant = form.save(commit=False)  
            tenant.lease = lease      
            tenant.save()
            messages.add_message(request, messages.SUCCESS, str(tenant.id) + "-SUCCESS Object created sucssefully")


            return redirect(uri)
    else:
        form = LeaseTenantForm()
    return render(request, 'object_edit.html', {'form': form, 'title': title, 'extend': EXTEND})

Meine Vorlagendatei

{% block title %}
        Add/Edit {{ title  }}
{% endblock title %}


{% block content %}

<div class="container">
        <div class="row">
            <div class="col-md-6 col-sm-12">
                    <h4>{{ title  }}</h4>
                    <br><div class="center">
                <form method="POST"  class="form" action="" method="get">
                    <div class="form-group">
                        {% csrf_token %}
                        {{ form|crispy}}



                        {{ form.media }}

                        <BR><BR>
                        <button type="submit" class="btn btn-primary btn-primary">Save</button>
                    </div>
                </form>
               </div>
            </div>
        </div>
</div>

 {% endblock content %} 

Also im Grunde funktioniert die automatische Vervollständigung nicht. Was muss ich validieren, damit es funktioniert?

Geben Sie hier die Bildbeschreibung ein

  • Es scheint mir, dass Sie vergessen else Aussage nach Tenant.objects.none()

    – Zagorodniy Olexiy

    13. November 2016 um 18:20 Uhr

  • Ich erhalte genau denselben Fehler, ich werde Sie wissen lassen, wenn ich es herausfinde

    – Programmierjoe

    13. November 2016 um 19:58 Uhr

Benutzer-Avatar
Programmierjoe

Ich hatte das gleiche Problem. Dies war eine gute Referenz: django-autocompletion-light einfache Fremdschlüsselvervollständigung zeigt nicht bearbeitbares Dropdown-Widget

Stellen Sie sicher, dass Sie die jquery in Ihre Header-Datei laden und die verwenden {{ form.media }} Tag für Ihr Formular.

So lade ich die jquery in meine Header-Datei:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script src="http://code.jquery.com/ui/1.9.2/jquery-ui.js"></script>

Haben Sie auch versucht, zu gehen tenant-autocomplete/ URL, um zu sehen, ob Sie die Ergebnisse auf dieser Seite erhalten, wie es im Tutorial erwähnt wird https://django-autocomplete-light.readthedocs.io/en/master/tutorial.html

Wenn Sie keine Ergebnisse von der URL erhalten, sollte dies der erste Fehler sein, den Sie beheben.

  • Danke Joe. Ich bekomme Ergebnis von der URL. Können Sie mir Ihre Ansicht zeigen, wo Sie das endgültige Formular aufrufen?

    – Ilja Bibik

    14. November 2016 um 0:30 Uhr


  • Ich verstehe es nicht. Die Vorlage in der Frage, auf die Sie sich beziehen, ist eigentlich nur eine Vorlage für die Autocomplete-Ansicht oder die eigentliche Vorlage für das eigentliche Formular.?

    – Ilja Bibik

    14. November 2016 um 0:58 Uhr


  • Nun, ich definiere mein Formular in meiner Datei forms.py, dann erstelle ich es in meiner Ansichtsdatei. Um dann in der Vorlage darauf zu verweisen, schreiben Sie einfach ‘{{.as_p }}’

    – Programmierjoe

    14. November 2016 um 1:52 Uhr

  • Mysteriöserweise fing es an zu funktionieren. Ich nehme an, dass etwas mit meinem Tag {{ form.media }} in der Vorlage nicht stimmte. Danke Joe, ich brauchte wirklich etwas Unterstützung.

    – Ilja Bibik

    15. November 2016 um 13:10 Uhr

  • Upvoted, tolle Antwort. Hat das gleiche Problem und das Hinzufügen von {{ form.media }} hat den Job gemacht. Das war im Tutorial so leicht zu übersehen!

    – Bernd Wechsel

    10. April 2019 um 11:12 Uhr

1011580cookie-checkdjango-autocomplete-light zeigt ein leeres Dropdown-Menü im Formular an

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy