ContentType Problema - Umano è un idiota - non riesce a capire come legare il modello originale ad un ContentType astratta modello di 'preferita'

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

  •  27-09-2019
  •  | 
  •  

Domanda

Iniziato qui: interrogazione Django iN come risultato di stringa - letterale non valido per int () con base 10

Ho un certo numero di applicazioni all'interno del mio sito, attualmente lavorando con un semplice "Blog" app. Ho sviluppato un 'Preferito' app, abbastanza facilmente, che sfrutta il quadro ContentType in Django per permettere a me di avere un 'preferita' di qualsiasi tipo ... cercando di andare nella direzione opposta, però, non so quello che ho 'sto facendo, e non riesce a trovare alcun esempio per.

Comincerò con il modello preferito:

preferito / 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")

Ora, che mi permette di scorrere i favoriti (a pagina "preferiti" di un utente, per esempio) e ottenere il blog oggetti associati tramite {{favorite.content_object.title}}.

Quello che voglio ora, e non riesco a capire, è quello che ho bisogno di fare per il modello blog per permettere a me di avere qualche cordicella per il favorito (quindi quando viene visualizzato in un elenco che può essere evidenziato, per esempio).

Ecco il modello 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"

Qualsiasi orientamento?

È stato utile?

Soluzione

Il dottore Django su di esso è qui: rapporti generici Reverse . Fondamentalmente sul Blog modello stesso è possibile aggiungere un GenericRelation ...

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

Per un dato blog è possibile trovare tutti i modelli Favorite che sono associati con esso ...

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

o vedere se l'utente corrente ha il blog Preferiti ...

user_has_blog_favorited = b.favorites.objects.filter(user=request.user).exists()
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top