0

私は自分の会社の Web サイト用に CMS を構築しています (既存の Django ソリューションを調べたところ、よりスリムでシンプルで、私たちの状況を具体的に処理するものが必要です..さらに、このことをよりよく学びたいです)。一般的な関係に頭を悩ませています。

私たちのウェブサイトのコンテンツを定義するモデルPageSoftwareModuleモデル、およびその他のいくつかのモデルがあり、それぞれがget_absolute_url()定義されています。Pageユーザーが任意のインスタンスに、他のページ インスタンスを含む任意のタイプのオブジェクトのリストを割り当てられるようにしたいと考えています。このリストは、そのPageインスタンスのサブメニューになります。

私は次のことを試しました:

class Page(models.Model):
    body = models.TextField()
    links = generic.GenericRelation("LinkedItem")

    @models.permalink
    def get_absolute_url(self):
        # returns the right URL

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

    title = models.CharField(max_length=100)

    def __unicode__(self):
        return self.title

class SoftwareModule(models.Model):
    name = models.CharField(max_length=100)
    description = models.TextField()

    def __unicode__(self):
        return self.name

    @models.permalink
    def get_absolute_url(self):
        # returns the right URL

これにより、API to do との一般的な関係が得られますpage_instance.links.all()。向かっています。どのようにやってのけるかわからないのは、ページインスタンスの変更フォーム、そのページとデータベース内の他の現存するオブジェクトとの間の関係を作成する方法です。私の望む最終結果:テンプレートで次をレンダリングします:

<ul>
{% for link in page.links.all %}
    <li><a href='{{ link.content_object.get_absolute_url() }}'>{{ link.title }}</a></li>
{% endfor%}
</ul>

もちろん、気づいていないことや誤解していることはありますが、自分が知らないことを知らないという領域に足を踏み入れているような気がします。私は何が欠けていますか?

4

3 に答える 3

1

はどのように にLinkedItem関連付けられていPageますか? AGenericRelationは逆の関係に使用されますが、このままでは関係がないため、一致するものはありません。これは、モデル設計で探しているものだと思います。

class Page(models.Model):
    body = models.TextField()
    # Moved generic relation to below

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

    # LinkedItems now relate to a Page model, and we're establishing the relationship
    # by specifying 'links' to keep the syntax you're looking for
    page = models.ForeignKey(Page, related_name='links')

    title = models.CharField(max_length=100)

余談ですが、このモデル設定によりLinkedItemPage. リンクされたアイテムを再利用したい場合は、M2M にすることができます。

class Page(models.Model):
    body = models.TextField()
    links = models.ManyToManyField(LinkedItem)

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

    title = models.CharField(max_length=100)

これらの両方のインスタンスで、page.links.all() はリンクされたすべてのアイテムになります。

また、括弧はテンプレート構文では使用されません。

于 2010-04-02T19:39:55.707 に答える
0

page.links.all の使用のように、テンプレート アクセス マネージャーを直接見たことがありません。

私の理解では、リンクをビューのリストとしてプルバックし、それを変数としてテンプレートに渡す必要があります。また、select_related を使用して事前に外部キーを解決する必要があります。

すなわち。

def some_view(request,*args,**kwargs):

  ...
  page_links = page_instace.links.select_related().all()
  ...

  return render_to_response(
                'the_template.html',
                #extra_context to pass to the template as var_name:value
                {
                    "page_links":page_links,
                },
                # needed if you need access to session variables like user info
                context_instance=RequestContext(request)
            )

それからテンプレートで...

<ul>
{% for link in page_links %}
    <li><a href='{{ link.content_object.get_absolute_url() }}'>{{ link.title }}</a></li>
{% endfor%}
</ul>

見る

もっとリンクを提供したかったのですが、スタックでは許可されませんでした。

于 2010-04-02T17:12:33.637 に答える
0

リストlink.content_object内にアクセスしようとしているのはなぜですか?page.link.all()このリスト内では、link.content_objectは常に と同じになりpageます。

私はあなたがここで何をしようとしているのか理解していないと思いますが、今のところ、そのコードはlink.titleテキストを含む現在のページへのすべてのリンクのリストを生成する必要があります.

何をしようとしているのか説明できますLinkedItemか?

于 2010-04-02T19:36:46.960 に答える