Почему Taggit (Django-Tag) не будет работать после того, как я использовал Tag.models.all () - PullRequest
2 голосов
/ 29 июня 2019

Я успешно реализовал django-taggit, пока не попытался использовать миксин для рендеринга тегов в ListView «PropertyListing» в этом примере:

Консоль постоянно говорит мне:

NameError: name 'Tag' is not defined

** ПРОБЛЕМА происходит из строки 4 views.py.

Я не могу импортировать «Tag» из модели, как «PropertyListing», поскольку это сторонняя библиотека.

Я попытался импортировать

from taggit.managers import TaggableManager

в views.pyно та же ошибка.

Я использую django 2.1 и django-taggit 1.1.0

ниже приведен код:

models.py

from taggit.managers import TaggableManager


class City(models.Model):
    name = models.CharField(max_length=200)
    slug = models.SlugField(max_length=250, unique=True)

    tags = TaggableManager()

    class Meta:
        verbose_name_plural = 'Cities'

    def __str__(self):
        return self.name

class PropertyListing(models.Model):
    name = models.CharField(max_length=200)
    slug = models.SlugField(max_length=250, unique=True)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    description = models.TextField(max_length=1000)
    address = models.CharField(max_length=1000)
    is_active = models.BooleanField(default=False)
    city = models.ForeignKey(City, on_delete=models.CASCADE, related_name='property_listings')

    class Meta:
        verbose_name_plural = 'Properties Listings'

    def __str__(self):
        return self.name

    def save(self, *args, **kwargs):
        self.slug = slugify(self.name)
        super(PropertyListing, self).save(*args, **kwargs)

    def get_absolute_url(self):
        return reverse('core:property_detail', kwargs={'pk': self.pk})

views.py

class TagMixin(object):
    def get_context_data(self, **kwargs):
        context = super(TagMixin, self).get_context_data(**kwargs)
        context['tags'] = Tag.objects.all()
        return context

class PropertyListingView(TagMixin, ListView):
    model = City
    model_type = PropertyImage
    queryset = PropertyListing.objects.all()
    context_object_name = 'properties'
    template_name = 'core/property-listing.html'

    def get_context_data(self, *args, **kwargs):
        context = super(PropertyListingView, self).get_context_data(**kwargs)
        context['cities'] = City.objects.all()
        context['properties'] = PropertyImage.objects.select_related('image_property_listing')
        return context


class CityTaggedView(TagMixin, ListView):
    model = City
    context_object_name = 'cities'
    template_name = 'core/city-tagged.html'

    def get_queryset(self):
        return City.objects.filter(tags__slug=self.kwargs.get('slug'))

urls.py

path('', PropertyListingView.as_view(), name='property_listing'),
    path('tag/<slug:slug>/', CityTaggedView.as_view(), name='city_tagged')

Любая помощь будет принята с благодарностью.Я не понимаю, почему это происходит.

1 Ответ

2 голосов
/ 29 июня 2019

Вам просто нужно импортировать Tag модель , например:

# app/views.py

# import the <b>Tag</b> class
from taggit.models import <b>Tag</b>

class TagMixin(object):
    def get_context_data(self, **kwargs):
        context = super(TagMixin, self).get_context_data(**kwargs)
        context['tags'] = <b>Tag</b>.objects.all()
        return context

# ...

В конце концов, ваш код использует Tag, но вы никогда не определяли это вваш views.py файл.Это не имеет ничего общего с Django или самим taggit, это просто Python, который не понимает, что вы имеете в виду под Tag.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...