Django autocomplete light, taggit и интерфейс администратора

Я пытаюсь использовать autocomplete_light и taggit в форме администратора.

Я прочитал документы по интеграции автозаполнения и taggit здесь, а документы по интеграции облегченного автозаполнения в админке здесь. Но, кажется, мало (или нет) обсуждений того, чтобы делать и то, и другое одновременно.

что у меня есть до сих пор.

In models.py:

from django.db import models
from taggit.managers import TaggableManager
from taggit.models import TagBase, GenericTaggedItemBase


class MyTag(TagBase):
    description = models.CharField(max_length = 250, blank = True, null = True)

class MyTagThroughModel(GenericTaggedItemBase):
    tag = models.ForeignKey(MyTag, related_name = "tagged_items")

class MyModel(models.Model):
    Name = models.CharField(max_length = 200)
    ...
    tags = TaggableManager(through = MyTagThroughModel)

In autocomplete_light_registry.py:

import autocomplete_light
from models import MyTag
autocomplete_light.register(MyTag)

Как я должен структурировать admin.py?

Если бы это была форма без прав администратора, поле было бы указано как:

tags = TagField(widget = TagWidget('MyTagAutocomplete'))

Если бы это была форма администратора без тегов, я бы добавил следующее в класс модели администратора:

form = autocomplete_light.modelform_factory(MyTag)

Как я могу совместить два?


person Luke    schedule 10.01.2014    source источник


Ответы (2)


Как я должен структурировать admin.py?

Вот пример автозаполнения тегов. Он показывает, как autocomplete_light и taggit работают с формами администратора и без администратора.

models.py

from django.db import models
from taggit.managers import TaggableManager

class MyModel(models.Model):
    name = models.CharField(max_length = 200)
    tags = TaggableManager(blank=True)

autocomplete_light_registry.py

import autocomplete_light
from taggit.models import Tag

autocomplete_light.register(Tag)

forms.py

from django import forms
import autocomplete_light
from autocomplete_light.contrib import taggit_tagfield
from models import MyModel

class MyModelForm(forms.ModelForm):
    tags = taggit_tagfield.TagField(widget=taggit_tagfield.TagWidget('TagAutocomplete'))
    class Meta:
        model = MyModel
        widgets = {
            'tags': autocomplete_light.TextWidget('TagAutocomplete'),
        }

admin.py

from django.contrib import admin
import autocomplete_light
from models import MyModel
from forms import MyModelForm

class MyModelAdmin(admin.ModelAdmin):
    form = MyModelForm
    model = MyModel

admin.site.register(MyModel, MyModelAdmin)

views.py

from django.views.generic.edit import CreateView
from models import MyModel
from forms import  MyModelForm

class CreateMyModel(CreateView):
    model = MyModel
    form_class = MyModelForm

urls.py

from django.conf.urls import patterns, url
from views import CreateMyModel

urlpatterns = patterns('',
     url(r'^create/$', CreateMyModel.as_view()),
)

краткие документы кажутся более простыми для понимания, чем документы вы смотрели.

person sebastian    schedule 12.01.2014
comment
Спасибо. Это заставило его работать. Между прочим, я использую url(r'autocomplete/', include('autocomplete_light.urls')), в urls.py, но я уверен, что есть и другие способы сделать это. - person Luke; 13.01.2014
comment
На самом деле ... это все еще вызывает проблему. Он отлично работает, когда я добавляю новую запись, но когда я иду редактировать существующую запись, я получаю: Error during template rendering In template (...)/local/lib/python2.7/site-packages/django/contrib/admin/templates/admin/includes/fieldset.html, error at line 19 int() argument must be a string or a number, not 'QuerySet' - person Luke; 13.01.2014
comment
Я только что отредактировал свой ответ и изменил form.py и admin.py. Это должно позволить вам редактировать записи. Я все еще вижу проблему с тегами, загруженными в другом формате, я рассмотрю ее, но, по крайней мере, это даст вам отправную точку. - person sebastian; 14.01.2014
comment
Спасибо - так и есть. Увидев альтернативу, я предпочитаю MultipleChoiceWidget, чем TextWidget, но похоже, что autocomplete_light не поддерживает это... пока. - person Luke; 14.01.2014
comment
Теперь здесь можно найти некоторые документы по интеграции Auto Complete Light и Taggit: django -autocomplete-light.readthedocs.io/en/master/taggit.html - person k0nG; 20.08.2018

Попробуйте вместо этого использовать django-taggit-autosuggest. .

Пометить Autocomplete Autosuggest в Django

Лучше всего он работает со скином администратора django-grapelli.

person Pranab    schedule 05.04.2016
comment
Привет, я пытаюсь использовать django-taggit-autosuggest с djang 1.10, но у меня проблемы с шаблонами URL... urlpatterns = Patterns('taggit_autosuggest.views', NameError: name 'patterns' не определено. - person ratata; 07.06.2016
comment
django.conf.urls.patterns() устарел, вместо этого обновите свои urlpatterns, чтобы они представляли собой список экземпляров django.conf.urls.url(). - person Pranab; 26.10.2016