ContentType Problème - humain est un idiot - ne peut pas comprendre comment lier le modèle original à un modèle ContentType abstraire « favori »

StackOverflow https://stackoverflow.com/questions/2656637

  •  27-09-2019
  •  | 
  •  

Question

A l'origine a commencé ici: Django dans la requête à la suite de la chaîne - littéral non valide pour int () avec la base 10

J'ai un certain nombre d'applications dans mon site, travaille actuellement avec une application simple « blog ». J'ai développé une application « Favorite », assez facilement, qui met à profit le cadre de ContentType dans Django pour me permettre d'avoir un « favori » de tout type ... en essayant d'aller dans l'autre sens, cependant, je ne sais pas ce que je « m faire, et ne peut pas trouver des exemples pour.

Je vais commencer par le modèle préféré:

favori / models.py

from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic
from django.contrib.auth.models import User

class Favorite(models.Model):
        content_type    = models.ForeignKey(ContentType)
        object_id       = models.PositiveIntegerField()
        user            = models.ForeignKey(User)
        content_object  = generic.GenericForeignKey()

        class Admin:
                list_display = ('key', 'id', 'user')

        class Meta:
                unique_together = ("content_type", "object_id", "user")

Maintenant, qui me permet de boucler dans les favoris (sur la page "favoris" d'un utilisateur, par exemple) et obtenir les objets associés via le blog {{favorite.content_object.title}}.

Ce que je veux maintenant, et ne peut pas comprendre, est ce que je dois faire pour le modèle de blog pour me permettre d'avoir une certaine attache au favori (donc quand il est affiché dans une liste, il peut être mis en évidence, pour par exemple).

Voici le modèle de blog:

blog / models.py

from django.db import models
from django.db.models import permalink
from django.template.defaultfilters import slugify
from category.models import Category
from section.models import Section
from favorite.models import Favorite
from django.contrib.auth.models import User
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic

class Blog(models.Model):
        title           = models.CharField(max_length=200, unique=True)
        slug            = models.SlugField(max_length=140, editable=False)
        author          = models.ForeignKey(User)
        homepage        = models.URLField()
        feed            = models.URLField()
        description     = models.TextField()
        page_views      = models.IntegerField(null=True, blank=True, default=0 )
        created_on      = models.DateTimeField(auto_now_add = True)
        updated_on      = models.DateTimeField(auto_now = True)

        def __unicode__(self):
                return self.title

        @models.permalink
        def get_absolute_url(self):
                return ('blog.views.show', [str(self.slug)])

        def save(self, *args, **kwargs):
                if not self.slug:
                        slug = slugify(self.title)
                        duplicate_count = Blog.objects.filter(slug__startswith = slug).count()
                        if duplicate_count:
                                slug = slug + str(duplicate_count)
                        self.slug = slug
                super(Blog, self).save(*args, **kwargs)

class Entry(models.Model):
        blog            = models.ForeignKey('Blog')
        title           = models.CharField(max_length=200)
        slug            = models.SlugField(max_length=140, editable=False)
        description     = models.TextField()
        url             = models.URLField(unique=True)
        image           = models.URLField(blank=True, null=True)
        created_on      = models.DateTimeField(auto_now_add = True)

        def __unicode__(self):
                return self.title

        def save(self, *args, **kwargs):
                if not self.slug:
                        slug = slugify(self.title)
                        duplicate_count = Entry.objects.filter(slug__startswith = slug).count()
                        if duplicate_count:
                                slug = slug + str(duplicate_count)
                        self.slug = slug
                super(Entry, self).save(*args, **kwargs)

        class Meta:
                verbose_name = "Entry"
                verbose_name_plural = "Entries"

Toute orientation?

Était-ce utile?

La solution

Le django doc sur c'est ici: relations génériques inverse . En gros sur le modèle de blog lui-même, vous pouvez ajouter un GenericRelation ...

class Blog(models.Model):
    favorites = generic.GenericRelation(Favorite)

Pour un blog donné, vous pouvez trouver tous les modèles de Favorite qui y sont associés ...

b = Blog.objects.get(slug='hello-world-blog-slug')
all_blog_favorites = b.favorites.objects.all()

Ou si l'utilisateur a le blog ... Favorited

user_has_blog_favorited = b.favorites.objects.filter(user=request.user).exists()
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top