ホームページ  >  記事  >  バックエンド開発  >  Djangoadminsite(3)InlineModelAdmin

Djangoadminsite(3)InlineModelAdmin

黄舟
黄舟オリジナル
2016-12-23 17:46:141922ブラウズ

InlineModelAdmin

class InlineModelAdmin
class TabularInline
class StackedInline

たとえば、2 つのモデルがあります:

from django.db import models

class Author(models.Model):
name = models.CharField(max_length=100) )

class Book(models.Model):
author = models.ForeignKey(Author)
title = models.CharField(max_length=100)

著者ページでブックを編集したい場合:

django から。 contrib import admin

class BookInline(admin.TabularInline):
model = Book

class AuthorAdmin(admin.ModelAdmin):
inlines = [
, BookInline,
]

Django は InlineModelAdmin の 2 つのサブクラスを提供します:

TabularInline
StackedInline
違いは、使用されるテンプレートです。

InlineModelAdmin オプション

InlineModelAdmin と ModelAdmin に共通のオプションは次のとおりです:

form
fieldsets
fields
formfield_overrides
exclude
filter_horizo​​ntal
filter_vertical
ordering
PRepopulated_fields
get_queryset( )
radio_fields
readonly_fields
raw_id_fields
formfield_for_choice_field()
formfield_for_foreignkey ()
formfield_for_manytomany()
has_add_permission()
has_change_permission()
has_delete_permission()

追加のオプションは次のとおりです:

InlineModelAdmin.model
インラインで使用されるモデル (必須)。

InlineModelAdmin.fk_name
複数の外部キーがある場合に使用されるモデルの名前。

InlineModelAdmin.formset
デフォルトのBaseInlineFormSet。

InlineModelAdmin.form
デフォルトのモデルフォーム。フォームセットの作成時に inlineformset_factory() に渡されます。

InlineModelAdmin.extra
インラインの追加数。

InlineModelAdmin.get_extra() はインラインの追加数も返します。

InlineModelAdmin.max_num
表示できる最大数。

InlineModelAdmin.get_max_num() もこの数値を返します。

InlineModelAdmin.min_num
表示できる最小数。

InlineModelAdmin.get_min_num() もこの数値を返します。

InlineModelAdmin.raw_id_fields
ModelAdmin と同じ。

class BookInline(admin.TabularInline):
model = Book
raw_id_fields = ("pages",)

InlineModelAdmin.template
使用されるテンプレート。

InlineModelAdmin.verbose_name
はメタクラスのverbose_nameをオーバーライドします。

InlineModelAdmin.verbose_name_plural
上記と同じ

InlineModelAdmin.can_delete
デフォルトはTrueです。

InlineModelAdmin.get_formset(request, obj=None, **kwargs)
ModelAdmin.get_formsets_with_inlines.を参照

InlineModelAdmin.get_extra(request, obj=None, **kwargs)

class BinaryTreeAdmin(admin.TabularInline):
model = BinaryTree

def get_extra(self, request, obj=None, **kwargs):
extra = 2
if obj:
return extra - obj.binarytree_set.count()
return extra

InlineModelAdmin.get_max_num( request , obj=None, **kwargs)

class BinaryTreeAdmin(admin.TabularInline):
model = BinaryTree

def get_max_num(self, request, obj=None, **kwargs):
max_num = 10
if obj 。親:
を通じてoff ' ' ' ' ' ' ' スルー スルー スルー スルー ‐ ‐ ‐ ‐‐‐‐‐ ‐ 5
‐ ‐ ‐ ‐ ‐ return max_num

InlineModelAdmin。 get_min_num(request, obj=None, **kwargs)
上記を参照してください。

同じModelに複数のForeignKeyがリンクされている場合

複数の外部キーがある場合:

django.dbからモデルをインポート

class Friendship(models.Model):
to_person = models.ForeignKey(person, relationship_name= "friends")
from_person = models.ForeignKey(person, relationship_name="from_friends")

そのうちの 1 つを表示します:

from django.contrib import admin
from myapp.models import Friendship

class FriendshipInline(admin.TabularInline) ) :
model = Friendship
fk_name = "to_person"

class PersonAdmin(admin.ModelAdmin):
inlines = [
FriendshipInline,
]

多対多モデルの操作

モデルの例 :

from django .db import models

class person(models.Model):
name = models.CharField(max_length=128)

class Group(models.Model):
name = models.CharField(max_length=128)
members =モデル .ManyToManyField(person, relationship_name='groups')

インライン表示:

django.contrib から import admin

class MembershipInline(admin.TabularInline):
モデル = Group.members.through

class PersonAdmin(admin.ModelAdmin):
inlines = [
MembershipInline,
]

class GroupAdmin(admin .ModelAdmin):
inlines = [
MembershipInline,
]
exclude = ('members',)

注:

まず、MembershipInline クラスは、Group.members.through の管理を指します。多対多のリレーショナル データベース

次に、GroupAdmin はメンバー フィールドを除外する必要があります

多対多の中間モデルの使用

中間モデルの例を明示的に指定します:

from django.db import models

クラス Person(models.Model):
name = models.CharField(max_length=128)

class Group(models.Model):
name = models.CharField(max_length=128)
members = models.ManyToManyField(Person, through='Membership')

class Membership(models.Model):
person = models.ForeignKey(person)
group = models.ForeignKey(Group)
date_joined = models.DateField()
Invitation_reason = models.CharField(max_length =64)

最初のステップ:

class MembershipInline(admin.TabularInline):
モデル = Membership
extra = 1

2 番目のステップ:

class PersonAdmin(admin.ModelAdmin):
inlines = (MembershipInline ,)

class GroupAdmin(admin.ModelAdmin):
inlines = (MembershipInline,)

ステップ 3:

admin.site.register(person, PersonAdmin)
admin.site.register(Group, GroupAdmin)

使用インラインとしての一般的な関係

一般的に関連するオブジェクトのインライン 例:

from django.db import models
from django.contrib.contenttypes.fields import GenericForeignKey

class Image(models.Model):
image = models.ImageField (upload_to="images")
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey("content_type", "object_id")

class Product(models.Model):
name = models.CharField(max_length=100)

製品の追加/変更ページで Image インスタンスを編集したい場合は、GenericTabularInline または GenericStackedInline を使用できます:

from django.contrib import admin
from django.contrib.contenttypes。 admin import GenericTabularInline

from myproject.myapp.models import Image, Product

class ImageInline(GenericTabularInline):
model = Image

class ProductAdmin(admin.ModelAdmin):
inlines = [
ImageInline,
]

admin. site .register(Product, ProductAdmin)

上記は Djangoadminsite (3) InlineModelAdmin の内容です。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。