J'ai un modèle de poste et de catégorie. Ici, je veux lister les articles par catégorie. Le nom de la catégorie sera le titre de la page et le message avec la même catégorie sera rendu sous cette page. Et je n'ai aucune idée de comment faire ça.

C'est mon modèle

from django.db import models
from django.utils import timezone
from slugger import AutoSlugField
from django.contrib.auth.models import User
from django.urls import reverse
# Create your models here.

def upload_location(instance, filename):
    return "%s/%s" %(instance.slug, filename)

class Category(models.Model):
    title = models.CharField(max_length= 60)
    slug = AutoSlugField(populate_from='title')
    parent = models.ForeignKey('self',blank=True, null=True ,related_name='children',on_delete=models.CASCADE)
    updated = models.DateTimeField(auto_now=True, auto_now_add=False)
    timestamp = models.DateTimeField(auto_now=False, auto_now_add=True)

    class Meta:
        verbose_name_plural = 'categories'
    def __unicode__(self):
        return self.title

    def __str__(self):
        return self.title



class Post(models.Model):
    title = models.CharField(max_length=120)
    slug = AutoSlugField(populate_from='title')
    image = models.ImageField(
        upload_to=upload_location,
        null=True, 
        blank=True,
    )
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    content = models.TextField()
    date_posted = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(User, on_delete=models.CASCADE)


    def __str__(self):
        return self.title


    def get_absolute_url(self, slug=None):
        return reverse("posts-detail", kwargs={"slug": self.slug})

post / view.py

def posts_list(request):
    post = Post.objects.all()
    category = Category.objects.all()
    context = {
        'post': post,
        'category': category,
        'title': 'Post list'
    }
    return render(request, 'posts/home.html', context)
0
aditya kumar 9 mars 2019 à 11:51

2 réponses

Meilleure réponse

La première chose que vous devez ajouter est related_name dans votre modèle de clé étrangère,

class Post(models.Model):
     category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name='postcategory')

Ensuite, vous devez ajouter plusieurs catégories à votre même vue. Vous pouvez l'ajouter avec un jeu de requêtes simple ou en utilisant get_context_data,

class HomeView(ListView):
    template_name = 'home.html'
    model = Category
    context_object_name = 'all_categs'

    def get_queryset(self):
       return Category.objects.all()

    def get_context_data(self):
        context = super(HomeView, self).get_context_data()
        context['latest_posts'] = Post.objects.order_by('-date_posted')[0:3] #or simply [:3]
        # This will show your 3 latest posts you can add accordingly
        return context

    def get_success_url(self):
       return reverse('home') #add your path

En HTML, vous devez le montrer,

{% for post in latest_posts %}
    <p>{{post.title}}</p>
    #other attributes
{% endfor %}

{% for ct in all_categs %}
<div>
    <div> {{ct.title}} </div>
    {% for post in ct.postcategory.all|dictsortreversed:"date_posted" %}
       <p> {{post.title}} </p>
       # add other fields
    {% endfor %}
 </div>
{% endfor %}

Maintenant, c'est à vous de décider comment vous voulez rendre votre vue frontale. Je n'ai pas testé ce code, si vous trouvez une erreur, faites-le moi savoir ou trouvez une réponse dans SO,

Remarque - Django Queryset est paresseux, donc si vous avez beaucoup de catégories, cela peut ralentir le temps de chargement de votre page. Assurez-vous donc d'améliorer la vitesse de la page avec la mise en cache et d'autres choses.

Edit-1: lorsque vous souhaitez afficher deux attributs de modèle, vous pouvez utiliser get_context_data. Si vous souhaitez ajouter un formulaire, vous pouvez également l'ajouter de la même manière.

2
Bidhan Majhi 9 mars 2019 à 11:41

Si vous voulez cette fonctionnalité dans votre site d'administration, vous pouvez remplacer la méthode formfield_for_foreignkey qui appartient à l'origine à admin.ModelAdmin.

Visitez https://docs.djangoproject.com/en/2.1/ref/ contrib/admin/

Et voir la section ModelAdmin.formfield_for_foreignkey(db_field, request, **kwargs)

0
Anuj Subedi 9 mars 2019 à 09:08