1

I have problem when trying to override the 'tags' field displaying. I am using django-taggit and django-taggit-labels.

Here is the code:

# models.py
class Cat(models.Model):
    name = models.CharField(max_length=30)

    tags = TaggableManager()

    def __str__(self):
        return self.name


# admin.py
from django import forms
from taggit_labels.widgets import LabelWidget
class ProductAdminForm(forms.ModelForm):
    class Meta:
        model = Cat
        fields = ['name','tags']
        widgets = {
            'tags': LabelWidget(),
        }


@admin.register(Cat)
class CatAdmin(admin.ModelAdmin):
    form = ProductAdminForm

I've taken the approach from https://github.com/bennylope/django-taggit-labels/issues/16 But that doens't work because of error in http://127.0.0.1:8000/admin/exp/cat/1/change/ page.

And the page was talking 'list' object has no attribute 'select_related'

Here is also one more error information.

And the message error in console:

Internal Server Error: /admin/exp/cat/1/change/
Traceback (most recent call last):
  File "C:\Users\lyf20\Documents\Student\Django\proj2\venv\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "C:\Users\lyf20\Documents\Student\Django\proj2\venv\lib\site-packages\django\core\handlers\base.py", line 145, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Users\lyf20\Documents\Student\Django\proj2\venv\lib\site-packages\django\core\handlers\base.py", line 143, in _get_response
    response = response.render()
  File "C:\Users\lyf20\Documents\Student\Django\proj2\venv\lib\site-packages\django\template\response.py", line 106, in render
    self.content = self.rendered_content
  File "C:\Users\lyf20\Documents\Student\Django\proj2\venv\lib\site-packages\django\template\response.py", line 83, in rendered_content
    content = template.render(context, self._request)
  File "C:\Users\lyf20\Documents\Student\Django\proj2\venv\lib\site-packages\django\template\backends\django.py", line 61, in render
    return self.template.render(context)
  File "C:\Users\lyf20\Documents\Student\Django\proj2\venv\lib\site-packages\django\template\base.py", line 171, in render
    return self._render(context)
  File "C:\Users\lyf20\Documents\Student\Django\proj2\venv\lib\site-packages\django\template\base.py", line 163, in _render
    return self.nodelist.render(context)
  File "C:\Users\lyf20\Documents\Student\Django\proj2\venv\lib\site-packages\django\template\base.py", line 937, in render
    bit = node.render_annotated(context)
  File "C:\Users\lyf20\Documents\Student\Django\proj2\venv\lib\site-packages\django\template\base.py", line 904, in render_annotated
    return self.render(context)
  File "C:\Users\lyf20\Documents\Student\Django\proj2\venv\lib\site-packages\django\template\loader_tags.py", line 150, in render
    return compiled_parent._render(context)
  File "C:\Users\lyf20\Documents\Student\Django\proj2\venv\lib\site-packages\django\template\base.py", line 163, in _render
    return self.nodelist.render(context)
  File "C:\Users\lyf20\Documents\Student\Django\proj2\venv\lib\site-packages\django\template\base.py", line 937, in render
    bit = node.render_annotated(context)
  File "C:\Users\lyf20\Documents\Student\Django\proj2\venv\lib\site-packages\django\template\base.py", line 904, in render_annotated
    return self.render(context)
  File "C:\Users\lyf20\Documents\Student\Django\proj2\venv\lib\site-packages\django\template\loader_tags.py", line 150, in render
    return compiled_parent._render(context)
  File "C:\Users\lyf20\Documents\Student\Django\proj2\venv\lib\site-packages\django\template\base.py", line 163, in _render
    return self.nodelist.render(context)
  File "C:\Users\lyf20\Documents\Student\Django\proj2\venv\lib\site-packages\django\template\base.py", line 937, in render
    bit = node.render_annotated(context)
  File "C:\Users\lyf20\Documents\Student\Django\proj2\venv\lib\site-packages\django\template\base.py", line 904, in render_annotated
    return self.render(context)
  File "C:\Users\lyf20\Documents\Student\Django\proj2\venv\lib\site-packages\django\template\loader_tags.py", line 62, in render
    result = block.nodelist.render(context)
  File "C:\Users\lyf20\Documents\Student\Django\proj2\venv\lib\site-packages\django\template\base.py", line 937, in render
    bit = node.render_annotated(context)
  File "C:\Users\lyf20\Documents\Student\Django\proj2\venv\lib\site-packages\django\template\base.py", line 904, in render_annotated
    return self.render(context)
  File "C:\Users\lyf20\Documents\Student\Django\proj2\venv\lib\site-packages\django\template\loader_tags.py", line 62, in render
    result = block.nodelist.render(context)
  File "C:\Users\lyf20\Documents\Student\Django\proj2\venv\lib\site-packages\django\template\base.py", line 937, in render
    bit = node.render_annotated(context)
  File "C:\Users\lyf20\Documents\Student\Django\proj2\venv\lib\site-packages\django\template\base.py", line 904, in render_annotated
    return self.render(context)
  File "C:\Users\lyf20\Documents\Student\Django\proj2\venv\lib\site-packages\django\template\defaulttags.py", line 209, in render
    nodelist.append(node.render_annotated(context))
  File "C:\Users\lyf20\Documents\Student\Django\proj2\venv\lib\site-packages\django\template\base.py", line 904, in render_annotated
    return self.render(context)
  File "C:\Users\lyf20\Documents\Student\Django\proj2\venv\lib\site-packages\django\template\loader_tags.py", line 188, in render
    return template.render(context)
  File "C:\Users\lyf20\Documents\Student\Django\proj2\venv\lib\site-packages\django\template\base.py", line 173, in render
    return self._render(context)
  File "C:\Users\lyf20\Documents\Student\Django\proj2\venv\lib\site-packages\django\template\base.py", line 163, in _render
    return self.nodelist.render(context)
  File "C:\Users\lyf20\Documents\Student\Django\proj2\venv\lib\site-packages\django\template\base.py", line 937, in render
    bit = node.render_annotated(context)
  File "C:\Users\lyf20\Documents\Student\Django\proj2\venv\lib\site-packages\django\template\base.py", line 904, in render_annotated
    return self.render(context)
  File "C:\Users\lyf20\Documents\Student\Django\proj2\venv\lib\site-packages\django\template\defaulttags.py", line 209, in render
    nodelist.append(node.render_annotated(context))
  File "C:\Users\lyf20\Documents\Student\Django\proj2\venv\lib\site-packages\django\template\base.py", line 904, in render_annotated
    return self.render(context)
  File "C:\Users\lyf20\Documents\Student\Django\proj2\venv\lib\site-packages\django\template\defaulttags.py", line 209, in render
    nodelist.append(node.render_annotated(context))
  File "C:\Users\lyf20\Documents\Student\Django\proj2\venv\lib\site-packages\django\template\base.py", line 904, in render_annotated
    return self.render(context)
  File "C:\Users\lyf20\Documents\Student\Django\proj2\venv\lib\site-packages\django\template\defaulttags.py", line 309, in render
    return nodelist.render(context)
  File "C:\Users\lyf20\Documents\Student\Django\proj2\venv\lib\site-packages\django\template\base.py", line 937, in render
    bit = node.render_annotated(context)
  File "C:\Users\lyf20\Documents\Student\Django\proj2\venv\lib\site-packages\django\template\base.py", line 904, in render_annotated
    return self.render(context)
  File "C:\Users\lyf20\Documents\Student\Django\proj2\venv\lib\site-packages\django\template\defaulttags.py", line 309, in render
    return nodelist.render(context)
  File "C:\Users\lyf20\Documents\Student\Django\proj2\venv\lib\site-packages\django\template\base.py", line 937, in render
    bit = node.render_annotated(context)
  File "C:\Users\lyf20\Documents\Student\Django\proj2\venv\lib\site-packages\django\template\base.py", line 904, in render_annotated
    return self.render(context)
  File "C:\Users\lyf20\Documents\Student\Django\proj2\venv\lib\site-packages\django\template\base.py", line 993, in render
    return render_value_in_context(output, context)
  File "C:\Users\lyf20\Documents\Student\Django\proj2\venv\lib\site-packages\django\template\base.py", line 972, in render_value_in_context
    value = str(value)
  File "C:\Users\lyf20\Documents\Student\Django\proj2\venv\lib\site-packages\django\utils\html.py", line 388, in <lambda>
    klass.__str__ = lambda self: mark_safe(klass_str(self))
  File "C:\Users\lyf20\Documents\Student\Django\proj2\venv\lib\site-packages\django\forms\boundfield.py", line 33, in __str__
    return self.as_widget()
  File "C:\Users\lyf20\Documents\Student\Django\proj2\venv\lib\site-packages\django\forms\boundfield.py", line 93, in as_widget
    renderer=self.form.renderer,
  File "C:\Users\lyf20\Documents\Student\Django\proj2\venv\lib\site-packages\taggit_labels\widgets.py", line 68, in render
    current_tags = [o.tag for o in value.select_related("tag")]
AttributeError: 'list' object has no attribute 'select_related'

SOLUTION

I've only installed taggit-labels directly from Git. I followed by instruction from pip install from git repo branch. The Problem was that command
pip install taggit-labels

is downloading old-versioned resource.

I really hope this post will help someone:^)
Cœur
  • 37,241
  • 25
  • 195
  • 267
Damir Nafikov
  • 162
  • 1
  • 9
  • `tags` is not a field, it's a manager object – Avinash Raj Aug 08 '19 at 07:56
  • @AvinashRaj, that's not entirely true: django-taggit makes sure that the `TaggableManager` shows up as a field in the `ModelAdmin` as well as in `ModelForm` (the same way ManyToManyFields do). See the [docs](https://django-taggit.readthedocs.io/en/latest/forms.html). But I'm not sure exactly how it does it and which constructs can be used and which not. – dirkgroten Aug 08 '19 at 09:06
  • @Damir, you should show the entire error stack trace (and not as an image link, but copy&paste from your console). I'm not sure which line of code is causing the error. – dirkgroten Aug 08 '19 at 09:07
  • @@dirkgroten , do you mean to me upload whole page with error? – Damir Nafikov Aug 08 '19 at 14:59
  • I assume you're running locally on your machine, so yes, copy & paste the entire error trace (from your console where you're running runserver, not from the page in your browser). Don't make an image/screenshot, copy&paste. – dirkgroten Aug 08 '19 at 15:01
  • @dirkgroten , done! – Damir Nafikov Aug 08 '19 at 17:37

1 Answers1

0

The documentation for django-taggit-labels tells you how to do it:

class ProductAdminForm(forms.ModelForm):
    tags = TagField(required=False, widget=LabelWidget)

    class Meta:
        model = Cat
        fields = ['name','tags']

dirkgroten
  • 20,112
  • 2
  • 29
  • 42