I want show all Articles from specific category in my template ‘category_articles.list.html’ at the link: path(‘category/<name_of_category_SLUG>/’
I have:
URLS
urlpatterns = [ path('show/<int:pk>/<slug:slug>', ArticleDetailView.as_view(), name='article_detail'), path('all/', AllArticlesListView.as_view(), name='all_articles_list'), path('category/<slug:slug>/', CategoryArticlesList.as_view(), name='category_articles_list'), ]
MODELS
class Created(models.Model): created_on = models.DateTimeField(auto_now_add=True, null=True) class Meta: abstract = True class ArticleCategory(Created): category_name = models.CharField(max_length=128) slug = models.SlugField(null=False, unique=False) def save(self, *args, **kwargs): if not self.slug: self.slug = slugify(self.category_name) return super().save(*args, **kwargs) def __str__(self): return self.category_name class Meta: verbose_name_plural = 'Article categories' class Article(Created): title = models.CharField(max_length=120) author = models.ForeignKey(User, on_delete=models.CASCADE) snippet = models.TextField(null=False) # ustawić max_lenght body = RichTextField(null=False) category = models.ManyToManyField(ArticleCategory, related_name='articles') # TODO: ustawić on_delete image = models.ImageField(blank=True, null=True, upload_to='article_image/') slug = models.SlugField(null=False, unique=False) def save(self, *args, **kwargs): # opisać tą funckję if not self.slug: self.slug = slugify(self.title) return super().save(*args, **kwargs) def get_absolute_url(self): return reverse('news:article_detail', kwargs={'pk': self.pk, 'slug': self.slug}) def article_categories(self): # zwraca nam wszystkie kategorię artykułu w stringu return ", n".join([x.category_name for x in self.category.all()]) def __str__(self): return f"{self.title}" class Meta: verbose_name_plural = 'Articles'
VIEWS
class CategoryArticlesList(DetailView): template_name = 'news/category_articles_list.html' model = ArticleCategory class AllArticlesListView(ListView): template_name = 'news/articles_list.html' model = Article paginate_by = 2 def get_queryset(self): return self.model.objects.all().order_by('-created_on') class ArticleDetailView(DetailView): template_name = 'news/article_detail.html' model = Article
ARTICLES_LIST.HTML template
ALL NEWS {% if object_list %} {% for article in object_list %} TITLE: <a href="{{ article.get_absolute_url }}"> {{ article.title }} </a> CATEGORY_iterator: {% for category in article.category.iterator %} <a href="{% url 'news:category_articles_list' category.slug %}"> {{ category | upper}} </a> {% endfor %}<br>
ARTICLE_DETAIL.HTML template
ONE SPECIFIC NEWS <h3>TITLE: {{ article.title }}</h3> <a href="{% url 'news:article_detail' pk=article.pk slug=article.slug %}"> {% url 'news:article_detail' pk=article.pk slug=article.slug %}</a> <br> ID: {{ article.id }} <br> AUTHOR: {{ article.author.username }} <br> CATEGORY_iterator: {% for category in article.category.iterator %} <a href="{% url 'news:category_articles_list' category.slug %}"> {{ category | upper}} </a> {% endfor %}<br>
finally….
CATEGORY_ARTICLES_LIST.HTMLtemplate
ALL ARTICLES FROM CATEGORY: {{ articlecategory.category_name | upper }}
I don’t know how put all articles to ARTICLE_DETAIL.HTML template…
Advertisement
Answer
You can iterate all articles from the reverse relation:
articlecategory.articles.all
I am not sure if you can use that in django templates and if it needs to be used with or without the “()”.