personalizar modelos consultas avanzadas python django django-models django-admin

python - modelos - selección en línea de uno a muchos con el administrador de django



modelos en django (2)

¡Ahi esta! Desea InlineModelAdmin (consulte la documentación de InlineModelAdmin aquí)

Código de muestra en resumen:

class StudentAdminInline(admin.TabularInline): model = Student class ClassAdmin(admin.ModelAdmin): inlines = (StudentAdminInline, ) admin.site.register(Class, ClassAdmin)

Tengo una relación estándar de muchos a uno. Hay muchos campos, pero para nuestros propósitos aquí, el modelo relevante es:

class Class(models.Model): name = models.CharField(max_length=128) class Student(models.Model): class = models.ForeignKey(Class) name = models.CharField(max_length=128) address = models.CharField(max_length=128) # ...etc

Creé un administrador y funciona muy bien. incluso automáticamente tengo la posibilidad de configurar la clase cuando estoy editando un alumno. Sin embargo, cuando voy a crear / editar una clase, todo lo que obtengo es un cuadro de entrada para el nombre.

¿Hay alguna manera de agregar un cuadro / campo donde se puedan agregar Estudiantes como miembros de la Clase desde la página de administración de la Clase? Puedo hacer un formulario en línea, pero eso es para crear nuevos Estudiantes. Ya tengo todos mis alumnos creados y solo estoy buscando un método rápido para agregar múltiples estudiantes existentes a diferentes clases ''.


Aquí hay una solución de "forma personalizada", como sugirió Luke Sneeringer. De todos modos, estoy sorprendido por la ausencia de una solución inmediata de Django para este problema (bastante natural y probablemente común). ¿Me estoy perdiendo de algo?

from django import forms from django.db import models from django.contrib import admin class Foo(models.Model): pass class Bar(models.Model): foo = models.ForeignKey(Foo) class FooForm(forms.ModelForm): class Meta: model = Foo bars = forms.ModelMultipleChoiceField(queryset=Bar.objects.all()) def __init__(self, *args, **kwargs): super(FooForm, self).__init__(*args, **kwargs) if self.instance: self.fields[''bars''].initial = self.instance.bar_set.all() def save(self, *args, **kwargs): # FIXME: ''commit'' argument is not handled # TODO: Wrap reassignments into transaction # NOTE: Previously assigned Foos are silently reset instance = super(FooForm, self).save(commit=False) self.fields[''bars''].initial.update(foo=None) self.cleaned_data[''bars''].update(foo=instance) return instance class FooAdmin(admin.ModelAdmin): form = FooForm