Проблема с ContentType: человек - идиот - PullRequest
0 голосов
/ 17 апреля 2010

Первоначально началось здесь: Запрос Django IN как строковый результат - недопустимый литерал для int () с основанием 10

У меня есть несколько приложений на моем сайте, которые в настоящее время работают с простым приложением "Блог". Я разработал приложение «Избранное», достаточно легко, которое использует инфраструктуру ContentType в Django, чтобы позволить мне иметь «избранное» любого типа ... пытаясь пойти другим путем, однако я не знаю, что я делаю, и не могу найти примеры для.

Я начну с любимой модели:

любимый / 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")

Теперь это позволяет мне перебирать избранное (например, на странице «Избранное» пользователя) и получать связанные объекты блога через {{favour.content_object.title}}.

То, что я хочу сейчас и не могу понять, это то, что мне нужно сделать с моделью блога, чтобы позволить мне привязать некоторую привязку к любимой (поэтому, когда она отображается в списке, она может быть выделена, для пример).

Вот модель блога:

блог / 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"

Любое руководство?

1 Ответ

2 голосов
/ 17 апреля 2010

Документ на django находится здесь: Обратные родовые отношения . В основном к самой модели блога можно добавить GenericRelation ...

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

Для данного блога вы можете найти все Favorite модели, связанные с ним ...

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

Или посмотрите, пользуется ли блог у текущего пользователя ...

user_has_blog_favorited = b.favorites.objects.filter(user=request.user).exists()
...