2010-01-22 6 views
1

Отправил вопрос вчера, но я не был слишком ясен в отношении того, что я пытаюсь. Я изо всех сил пытаюсь найти полезные уроки о том, как лучше всего достичь этого, поэтому очень важно подтолкнуть вас в правильном направлении.django featured content field

Я создал модель, которая ссылается на django_content_type. Моя идея - использовать эту модель для ссылки на другие модели, чтобы они могли быть помечены как «отличное» содержимое, без необходимости добавлять новое поле «isFeatured» для каждой модели.

Все, что я хочу сделать, это установить флажок в формах моего администратора для каждой модели, который указывает, включен ли контент или нет.

class FeaturedContent(models.Model): 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    content_object = generic.GenericForeignKey('content_type', 'object_id') 

Во-первых, это правильный подход?

Нужно ли создать пользовательское поле формы/модели? и как мне ввести это поле в шаблон администратора?

Я искал внутри (django.contrib.contenttypes) generic.py, и вы можете четко видеть, где загружаются данные шаблона, а также какой шаблон используется. Мне интересно, возможно, мне нужно расширить этот класс, а не писать собственное поле?

Спасибо за любую помощь,

Джеймс

ответ

0

На мой взгляд, это не правильный подход. Вы лучше использовать abstract base classes с BooleanField, как это:

class FeaturedModel(models.Model): 
    is_featured = models.BooleanField(default = False) 

    class Meta: 
     abstract = True 

class Foobar(FeaturedModel): 
    title = models.CharField(max_length = 200) 
    ... 

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

+0

Это действительно потрясающая идея. Доминик, спасибо :) – Crungmungus

+1

Я немного опоздал, но этот способ не позволит вам получать качественный контент на разных моделях так же легко, как подход ContentType. Вам придется индивидуально запрашивать каждую отдельную модель для этого контента, а не только запрашивать модель FeaturedContent в подходе OP –