ContentType Problema - Umano è un idiota - non riesce a capire come legare il modello originale ad un ContentType astratta modello di 'preferita'
-
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?
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()