Maison >développement back-end >Tutoriel Python >Djangoadminsite(三)InlineModelAdmin

Djangoadminsite(三)InlineModelAdmin

黄舟
黄舟original
2016-12-23 17:46:141996parcourir

InlineModelAdmin

class InlineModelAdmin
class TabularInline
class StackedInline

Par exemple, il existe deux modèles :

à partir de modèles d'importation django.db

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

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

Si vous souhaitez modifier le livre sur la page Auteur :

depuis l'administrateur d'importation django.contrib

class BookInline (admin.TabularInline):
model = Book

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

Django propose deux sous-classes d'InlineModelAdmin :

TabularInline
StackedInline
La différence réside dans le modèle utilisé.

Options InlineModelAdmin

Les options communes à InlineModelAdmin et ModelAdmin sont :

form
fieldsets
fields
formfield_overrides
exclude
filter_horizontal
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()

Les options supplémentaires sont :

InlineModelAdmin.model
Le modèle utilisé en inline, obligatoire.

InlineModelAdmin.fk_name
Le nom du modèle, utilisé lorsqu'il y a plusieurs clés étrangères.

InlineModelAdmin.formset
BaseInlineFormSet par défaut.

InlineModelAdmin.form
Formulaire de modèle par défaut. Passé à inlineformset_factory() lors de la création du Formset.

InlineModelAdmin.extra
Nombre supplémentaire d'inline.

InlineModelAdmin.get_extra() renvoie également le nombre supplémentaire d'inline.

InlineModelAdmin.max_num
Le nombre maximum pouvant être affiché.

InlineModelAdmin.get_max_num() renvoie également ce numéro.

InlineModelAdmin.min_num
Le nombre minimum pouvant être affiché.

InlineModelAdmin.get_min_num() renvoie également ce numéro.

InlineModelAdmin.raw_id_fields
Identique à ModelAdmin.

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

InlineModelAdmin.template
Le modèle utilisé.

InlineModelAdmin.verbose_name
Remplace verbose_name dans la méta-classe.

InlineModelAdmin.verbose_name_plural
Identique à ci-dessus

InlineModelAdmin.can_delete
La valeur par défaut est True.

InlineModelAdmin.get_formset(request, obj=None, **kwargs)
Reportez-vous à 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.parent :
                                                                                             utiliser utiliser utiliser   utiliser utiliser              à travers à travers à travers off ' s ' ‐ ‐ ‐ ‐ ‐ ‐ ‐ 5
      ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ - 5

Lorsque plusieurs clés étrangères sont liées au même modèle


S'il y a plusieurs clés étrangères :

depuis django.db importez des modèles

class Friendship( models. Modèle):

to_person = models.ForeignKey(Person, Related_name="friends")

from_person = models.ForeignKey(Person, Related_name="from_friends")


Montré parmi eux A :

de django.contrib import admin

de myapp.models import Friendship

class FriendshipInline(admin.TabularInline):

model = Friendship
fk_name = "to_person "

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


Travailler avec plusieurs modèles

Exemple de modèle :

à partir de 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 = models.ManyToManyField(Person, Related_name='groups')


affichage en ligne :

de django.contrib import admin

class MembershipInline(admin.TabularInline):
model = Group.members.through

class PersonAdmin(admin.ModelAdmin):
Inlines = [
Membershipinline,
]

Class Groupadmin (admin.modladmin) :
Inlines = [
Membershipinline,


EXCLUDE = (' Mee mBers' ,)

Remarque :

Tout d'abord, la classe MembershipInline pointe vers Group.members.through. L'attribut through pointe vers la base de données qui gère le plusieurs à plusieurs.

Deuxièmement, l'administrateur de groupe doit exclure le champ des membres.

Travailler avec des modèles intermédiaires plusieurs-à-plusieurs

Spécifier explicitement l'exemple de modèle intermédiaire :


à partir de django.db importer des modèles

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

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

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

Étape 1 :


class MembershipInline(admin.TabularInline):
model = Membership
extra = 1

Étape 2 :


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

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

Étape 3 :


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

Utiliser des relations génériques en ligne

une en ligne avec génériquement Exemple d'objets associés :


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)

Si vous souhaitez modifier l'instance d'image sur la page d'ajout/modification de produit, vous pouvez utiliser GenericTabularInline ou GenericStackedInline :


depuis django.contrib import admin
depuis django.contrib.contenttypes.admin import GenericTabularInline

depuis myproject.myapp.models import Image, Product

class ImageInline(GenericTabularInline ):
model = Image

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

admin.site .register(Product , ProductAdmin)


Ce qui précède est le contenu de Djangoadminsite (3) InlineModelAdmin Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www.php.cn) !


Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn