Как добавить теги с помощью тега git в Django admin - PullRequest
0 голосов
/ 20 января 2020

Я пытаюсь добавить теги в приложение блога, используя django admin, но каждый раз, когда я добавляю тег через консоль администратора, я получаю эту ошибку Can't call similar_objects with a non-instance manager

Это потому, что я не сохранение тегов в админке или это потому, что я неправильно реализовал тег git?

Здесь я определяю свой вид, отображение и статью, я пытаюсь получить похожие статьи, используя тег git

def article(request, slug):
    article = Post.objects.filter(slug=slug).values()
    article_info = {
        "articles": article,
        "related_articles" : Post.tags.similar_objects()
    }

    return render(request, 'article.htm', article_info)

Обновление

Так выглядит моя модель поста

STATUS = (
    (0,"Draft"),
    (1,"Publish")
)

class Post(models.Model):
    title = models.CharField(max_length=200, unique=True)
    slug = models.SlugField(max_length=200, unique=True)
    author = models.CharField(max_length=200, unique=True)
    author_biography = models.TextField(default="N/A")
    updated_on = models.DateTimeField(auto_now= True)
    content = models.TextField()
    upload_image = models.ImageField(default="default.png", blank=True)
    created_on = models.DateTimeField(auto_now_add=True)
    status = models.IntegerField(choices=STATUS, default=0)
    tags = TaggableManager()

    class Meta:
        ordering = ['-created_on']

    def __str__(self):
        return self.title

Ответы [ 2 ]

1 голос
/ 20 января 2020

Да, я вижу проблему.

Вы пытаетесь получить доступ к тегам класса Post, а не к экземпляру Post. Тем не менее, вы также используете filter() и values(), а имя переменной в единственном числе, поэтому я думаю, что, возможно, и здесь есть недопонимание.

Я предполагаю, что вы хотите сделать следующее:

def article(request, slug):
    article = Post.objects.get(slug=slug)
    article_info = {
        "article": article,
        "related_articles" : article.tags.similar_objects()  # Instance of Post is article
    }

    return render(request, 'article.htm', article_info)
0 голосов
/ 20 января 2020

Обычно этот тип структуры создается с использованием ManyToMany отношений.

В таком случае ваш код должен выглядеть следующим образом:

class Tag(models.Model):
    name = models.CharField(max_length=255)

class Post(models.Model):
    title = models.CharField(max_length=200, unique=True)
    tag = models.ManyToManyField(Tag)

Чтобы добавить тег к сообщению:

post_obj = Post.objects.get(title="le title")
tag = Tag.objects.get(name="le name")
post_obj.tag.add(tag)

Для запроса:

post_obj = Post.objects.get(title="le title")
tags_in_post = post_obj.tag.all()

Это должно облегчить отображение вашей страницы. Предполагая, что вы хотите отобразить каждое сообщение, а внутри него каждый ваш код должен выглядеть примерно так:

// in the end of the view function:
return render(request, 'article.htm', context={'post': article_info})

// inside the template:

{% for p in post %}
<li> <span> {{p.title}} </span>

    {% for tag in post.tag %}
    <ul> {{tag.name}} </ul>
    {% endfor %}

</li>
{% endfor %}
...