Opened 2 years ago

Closed 2 years ago

Last modified 2 years ago

#33729 closed Bug (invalid)

AutocompleteSelect widget broken after moving from django 2.2 to django 3.2 — at Version 4

Reported by: exo Owned by: nobody
Component: contrib.admin Version: 3.2
Severity: Normal Keywords: AutocompleteSelect
Cc: Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description (last modified by exo)

Hello :) After upgrading Django version to 3.2, widget AutocompleteSelect that I use in django admin panel (to have a drop-down from which I can choose an object) is broken.

The error I see is

    AttributeError at /admin/question/
    'QuerySet' object has no attribute 'name'

    Request Method:	GET
    Request URL:	http://localhost:8000/admin/question/
    Django Version:	3.2.13
    Exception Type:	AttributeError
    Exception Value:	
    'QuerySet' object has no attribute 'name'
    Exception Location:	/home/django-app/env/lib/python3.8/site-packages/django/contrib/admin/widgets.py, line 412, in build_attrs
    Python Executable:	/home/django-app/env/bin/python3
    Python Version:	3.8.10
    Python Path:	
    ['/home/django-app/testsite',
     '/usr/lib/python38.zip',
     '/usr/lib/python3.8',
     '/usr/lib/python3.8/lib-dynload',
     '/home/django-app/env/lib/python3.8/site-packages']
    Server time:	Fri, 20 May 2022 10:13:27 +0000
    Error during template rendering
    In template /home/django-app/testsite/polls/templates/admin/question_export.html, error at line 18

    'QuerySet' object has no attribute 'name'
    11	
    12	{% block content %}
    13	    <div id="content-main">
    14	      <p>Select question to export:</p>
    15	        <form method="post" enctype="multipart/form-data">
    16	            {% csrf_token %}
    17	            <table>
    18	                {{form.as_table}}
    19	            </table>
    20	            <div class="submit-row">
    21	                <input type="submit" value="Export Question" />
    22	            </div>
    23	        </form>
    24	    </div>
    25	    {{form.media}}
    26	{% endblock %}
    27	

AutocompleteSelect inherits from AutocompleteMixin

When I compare AutocompleteMixin for django 3.2 and django 2.2
https://github.com/django/django/blob/3.2.13/django/contrib/admin/widgets.py#L410-L412
https://github.com/django/django/blob/2.2.7/django/contrib/admin/widgets.py#L411

I see that they added new attributes

    'data-app-label': self.field.model._meta.app_label,
    'data-model-name': self.field.model._meta.model_name,
    'data-field-name': self.field.name,

in django 3.2
but there is no name on self.field and probably that's why I get this error.

The code looks like this

view.py

    from django.forms import ModelChoiceField
    from django import forms
    from django.contrib import admin
    from django.contrib.admin.widgets import AutocompleteSelect

    class QuestionChoiceField(ModelChoiceField):
        widget = AutocompleteSelect(Question.objects.all(), admin.site)
    
    
    class QuestionExportForm(forms.Form):
        question = QuestionChoiceField(queryset=Question.objects.all(), required=True)
    
        def clean_question(self):
            return self.cleaned_data["question"]
    
    
    class QuestionExportView(FormView):
        template_name = "admin/question_export.html"
        form_class = QuestionExportForm
        success_url = "/admin/"
    
        def form_valid(self, form):
            question = form.cleaned_data.get("question")
            return generate_response(question)

models.py

    from django.db import models


    class Question(models.Model):
        uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
        question_text = models.CharField(max_length=200)
        pub_date = models.DateTimeField('date published')

templates/admin/question_export.html

    {% block content %}
        <div id="content-main">
          <p>Select question to export:</p>
            <form method="post" enctype="multipart/form-data">
                {% csrf_token %}
                <table>
                    {{form.as_table}}
                </table>
                <div class="submit-row">
                    <input type="submit" value="Export Question" />
                </div>
            </form>
        </div>
        {{form.media}}
    {% endblock %}

urls.py

from django.contrib.admin.views.decorators import staff_member_required
from django.urls import path

from polls.views import QuestionExportView

app_name = "question_exports"


urlpatterns = [
    path("admin/question/", staff_member_required(QuestionExportView.as_view()), name="question"),
    path('admin/', admin.site.urls),
]

How can I approach this issue? Any help would be appreciated :)!

Change History (4)

in reply to:  description comment:1 by Mariusz Felisiak, 2 years ago

Resolution: invalid
Status: newclosed

Replying to exo:

Hello :) After upgrading Django version to 3.2, widget AutocompleteSelect that I use in django admin panel (to have a drop-down from which I can choose an object) is broken.

The error I see is

    AttributeError at /admin/question/
    'QuerySet' object has no attribute 'name'

    Request Method:	GET
    Request URL:	http://localhost:8000/admin/question/
    Django Version:	3.2.13
    Exception Type:	AttributeError
    Exception Value:	
    'QuerySet' object has no attribute 'name'
    Exception Location:	/home/django-app/env/lib/python3.8/site-packages/django/contrib/admin/widgets.py, line 412, in build_attrs
    Python Executable:	/home/django-app/env/bin/python3
    Python Version:	3.8.10
    Python Path:	
    ['/home/django-app/testsite',
     '/usr/lib/python38.zip',
     '/usr/lib/python3.8',
     '/usr/lib/python3.8/lib-dynload',
     '/home/django-app/env/lib/python3.8/site-packages']
    Server time:	Fri, 20 May 2022 10:13:27 +0000
    Error during template rendering
    In template /home/django-app/testsite/polls/templates/admin/question_export.html, error at line 18

    'QuerySet' object has no attribute 'name'
    11	
    12	{% block content %}
    13	    <div id="content-main">
    14	      <p>Select question to export:</p>
    15	        <form method="post" enctype="multipart/form-data">
    16	            {% csrf_token %}
    17	            <table>
    18	                {{form.as_table}}
    19	            </table>
    20	            <div class="submit-row">
    21	                <input type="submit" value="Export Question" />
    22	            </div>
    23	        </form>
    24	    </div>
    25	    {{form.media}}
    26	{% endblock %}
    27	

AutocompleteSelect inherits from AutocompleteMixin

When I compare AutocompleteMixin for django 3.2 and django 2.2
https://github.com/django/django/blob/3.2.13/django/contrib/admin/widgets.py#L410-L412
https://github.com/django/django/blob/2.2.7/django/contrib/admin/widgets.py#L411

I see that they added new attributes

    'data-app-label': self.field.model._meta.app_label,
    'data-model-name': self.field.model._meta.model_name,
    'data-field-name': self.field.name,

in django 3.2
but there is no name on self.field and probably that's why I get this error.

self.field should be a Field instance not a QuerySet. Moreover autocomplete works for me. It looks like an issue in 3rd-party package (see similar reports for autocomplete e.g. #32619 and #32659).

Closing per TicketClosingReasons/UseSupportChannels.

comment:2 by Mariusz Felisiak, 2 years ago

Summary: [BUG] AutocompleteSelect widget broken after moving from django 2.2 to django 3.2\AutocompleteSelect widget broken after moving from django 2.2 to django 3.2

comment:3 by Mariusz Felisiak, 2 years ago

Summary: \AutocompleteSelect widget broken after moving from django 2.2 to django 3.2AutocompleteSelect widget broken after moving from django 2.2 to django 3.2

comment:4 by exo, 2 years ago

Description: modified (diff)
Note: See TracTickets for help on using tickets.
Back to Top