Я новичок в 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)
Если вам нужно больше точности, скажите мне :)