Content Ausgabe - Mensch ist ein Idiot - Figur kann nicht, wie zu einem Content das ursprüngliche Modell zu binden abstrahiert ‚Favorite‘ Modell
-
27-09-2019 - |
Frage
Ursprünglich begann hier: Django IN Abfrage als String Ergebnis - ungültig wörtliche für int () mit Basis 10
Ich habe eine Reihe von Anwendungen innerhalb meiner Website, die derzeit mit einem einfachen „Blog“ app zu arbeiten. Ich habe einen ‚Favoriten‘ App entwickelt, leicht genug, dass der Content Rahmen in Django nutzt mich zu erlauben, von jeder Art einen ‚Favoriten‘ zu haben ... versucht, den anderen Weg zu gehen, aber ich weiß nicht, was ich ‚mache und keine Beispiele für nicht finden können.
Ich werde mit dem Lieblingsmodell beginnen:
favorite / 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")
Nun, das mir erlaubt, durch die Favoriten-Schleife (auf einem Benutzer „Favoriten“ Seite, zum Beispiel) und erhalten die zugehörige Blog-Objekte über {{favorite.content_object.title}}.
Was will ich jetzt, und kann nicht herausfinden, ist das, was ich auf das Blog-Modell tun muß, mir zu erlauben, einige Haltegurt zu den Favoriten zu haben (so, wenn es in einer Liste angezeigt wird hervorgehoben werden kann, Beispiel).
Hier ist das Blog-Modell:
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"
Jede Führung?
Lösung
Der django doc drauf ist hier: Reverse-generic Beziehungen . Im Grunde genommen auf dem Blog Modell selbst können Sie fügen Sie ein GenericRelation
...
class Blog(models.Model):
favorites = generic.GenericRelation(Favorite)
Für einen bestimmten Blog können Sie alle der Favorite
Modelle, die mit ihm verbunden sind ...
b = Blog.objects.get(slug='hello-world-blog-slug')
all_blog_favorites = b.favorites.objects.all()
Oder sehen, ob der aktuelle Benutzer das Blog hat favorited ...
user_has_blog_favorited = b.favorites.objects.filter(user=request.user).exists()