2

私のモデルを見てください。

class BackgroundImage(models.Model):
    user = models.ForeignKey(User)
    image = models.ImageField(upload_to=get_upload_file_name)
    caption = models.CharField(max_length=200)
    pub_date = models.DateTimeField(default=datetime.now)

class ProfilePicture(models.Model):
    user = models.ForeignKey(User)
    image = models.ImageField(upload_to=get_upload_file_name)
    caption = models.CharField(max_length=200)
    pub_date = models.DateTimeField(default=datetime.now)

class Album(models.Model):
    user = models.ForeignKey(User)
    name = models.CharField(max_length=200)
    pub_date = models.DateTimeField(default=datetime.now)

    class Meta:
        ordering = ['-pub_date']
        verbose_name_plural = ('Albums')

    def __unicode__(self):
        return self.name

class Photo(models.Model):
    user = models.ForeignKey(User)
    album = models.ForeignKey(Album, default=3)
    image = models.ImageField(upload_to=get_upload_file_name)
    caption = models.CharField(max_length=200)
    pub_date = models.DateTimeField(default=datetime.now)

とのすべての画像Photoを1 つのセットで取得するにはどうすればよいですか。そして、それらをフィルターしてテンプレートに表示しますか? 私を助けてください。非常に高く評価されます! ありがとうございました。ProfilePictureBackgroundImageimage field-pub_date

編集

NB:私は次のように作業する必要がProfilePictureあります:BackgroundImageUserProfile

from django.db import models
from django.contrib.auth.models import User
from profile_picture.models import ProfilePicture
from background_image.models import BackgroundImage

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    permanent_address = models.TextField()
    temporary_address = models.TextField()
    profile_pic = models.ForeignKey(ProfilePicture)
    background_pic = models.ForeignKey(BackgroundImage)

    def __unicode__(self):
        return self.user.username

User.profile = property(lambda u: UserProfile.objects.get_or_create(user=u)[0])
4

1 に答える 1

4

これを行うための がInheritanceManager提供されています。 docsdjango-model-utilsを参照してください。

Linux / Mac にインストールするには:

sudo pip install django-model-utils

厄介なことに、Windows を使用してeasy_install、またはpipWindows にインストールするのはそれほど簡単ではありません。以下を参照してください: Windows に Python パッケージをインストールするにはどうすればよいですか? . ここdjango-model-util/からDjango プロジェクトの最上位ディレクトリにディレクトリをダウンロードするのが手っ取り早い方法です。これは、運用 Web サーバーにデプロイするためにプロジェクト全体をコピーする場合に便利です。

を使用するInheritanceManagerには、モデルを少しリファクタリングする必要があります。

from django.db import models
from django.contrib.auth.models import User
from datetime import datetime
from model_utils.managers import InheritanceManager

get_upload_file_name = 'images/' # I added this to debug models

class BaseImage(models.Model):
    user = models.ForeignKey(User)
    image = models.ImageField(upload_to=get_upload_file_name)
    caption = models.CharField(max_length=200)
    pub_date = models.DateTimeField(default=datetime.now)

    objects = InheritanceManager()

class BackgroundImage(BaseImage):
    pass

class ProfilePicture(BaseImage):
    pass

class Album(models.Model):
    user = models.ForeignKey(User)
    name = models.CharField(max_length=200)
    pub_date = models.DateTimeField(default=datetime.now)

    class Meta:
        ordering = ['-pub_date']
        verbose_name_plural = ('Albums')

    def __unicode__(self):
        return self.name

class Photo(BaseImage):
    album = models.ForeignKey(Album, default=3)

すべての Image モデルは、 のインスタンスを作成する共通のスーパー クラスから継承するようになりましたInheritanceManager。また、複製されたすべての属性をスーパークラスに移動しましたが、これは厳密には必要ではありません。テンプレートにInheritanceManager存在しない属性にBaseImageは引き続きアクセスできるという手段を使用します。

で並べ替えられたリストを取得するには-pubdate:

BaseImage.objects.select_subclasses().order_by("-pub_date")

ビューで使用するには:

def recentImages(request):
    r = BaseImage.objects.select_subclasses().order_by("-pub_date")[:20]
    return  render_to_response("recentImages.html", { "imageList" : r })

テンプレートで使用するには:

{% for photo in imageList %}
  <img src="{{ photo.image.url }}" />
{% endfor %}

これはあなたが探しているもののようなものですか?

編集

次のコードは、新しいモデルでも問題なく動作します。

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    permanent_address = models.TextField()
    temporary_address = models.TextField()
    profile_pic = models.ForeignKey(ProfilePicture)
    background_pic = models.ForeignKey(BackgroundImage)

ForeignKeyリレーションシップの最後の 2 つのモデルの名前が正しいことを確認してください。

于 2013-11-10T13:27:13.947 に答える