Django получить все сообщения родительской категории - PullRequest
0 голосов
/ 03 апреля 2020

Я новичок в django 3, и я решил создать простой блог, чтобы узнать, чему я научился.

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

Например, у меня есть это меню:

* Informatic * Django * HTML - CSS

* Графика c

Если я нажимаю django, у меня есть все мои django post, то же самое для html - css, но теперь я хочу, чтобы вся информация c post, сообщения, которые имеют django + html - css вместе.

Я могу изменить свою модель Post и вместо этого иметь поле с категорией во внешнем ключе, я мог бы использовать поле manytomany. Но я не хочу этого, потому что могу забыть добавить информацию c или другую категорию. Так что я мог бы сделать простым способом?

Можете ли вы объяснить мне, что и как делать, и где мне нужно поместить код

Я не уверен, какой код вам нужен , а там:

 class Category(models.Model):
    title = models.CharField(max_length=100)
    slug = models.SlugField(max_length=250, null=True, blank=True)
    menu = models.BooleanField(default=False, null=True, blank=True)
    parent = models.ForeignKey('self', null=True, blank=True, on_delete=models.SET_NULL,related_name='subcategory')

    def children(self):
        """Return replies of a comment."""
        return Category.objects.filter(parent=self, menu=1)

    @property
    def is_parent(self):
        """Return `True` if instance is a parent."""
        if self.parent is not None:
            return False
        return True

    def __str__(self):
        return self.title


class CategoryManager(models.Manager):
    def all(self):
        """Return results of instance with no parent (not a reply)."""
        qs = super().filter(parent=None)
        return qs

И мой вариант поста без других полей


class Post(models.Model):

    title = models.CharField(max_length=100)
    category = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True, default=1)

И в моем шаблоне меню:

<ul>
    {% for category in categories%}
    {% if not category.parent %}
    <li><a href="{% url 'category-post' cslug=category.slug%}">{{ category.title }}</a></li>
        {% for subcategory in category.children %}
            <li>
                <a href="{% url 'category-post' cslug=subcategory.slug %}">--- {{ subcategory.title }}</a>
            </li>
        {% endfor %}
    {% endif %}
    {% endfor %}
</ul>

И вид

def category_post(request, cslug ):
    posts = Post.objects.filter(category__slug=cslug)
    category = Category.objects.get(slug=cslug)
    context = {
        'category': category,
        'posts': posts,
    }

    return render(request, 'blog/category_post.html', context)

Если вам нужно больше точности, скажите мне :)

Ответы [ 2 ]

0 голосов
/ 04 апреля 2020

Я так устал, что даже не заметил, что создал в своей модели защиту, и я использую ее с вашими ответами, и теперь она работает. Спасибо вам обоим

0 голосов
/ 03 апреля 2020

добавьте параметр related_name в Foriegnkey в модели Post. REF: DOCS

, вы сможете вызывать сообщения из категории со связанным именем ... так что если вы сделаете relate_name='posts', то означает, что вы будете иметь доступ к сообщениям из этой категории category.posts.all() или category.posts.filter() или category.posts.all()[slice]

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