代码之家  ›  专栏  ›  技术社区  ›  Hameer Abbasi

覆盖多个表格行的表单小部件和/或表单

  •  0
  • Hameer Abbasi  · 技术社区  · 7 年前

    假设我有两个模型,如下所示(示例来自 Django Docs )

    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 = models.ManyToManyField(Person, related_name='groups')
    

    以及以下管理面板:

    from django.contrib import admin
    
    class MembershipInline(admin.TabularInline):
        model = Group.members.through
    
    class PersonAdmin(admin.ModelAdmin):
        inlines = [
            MembershipInline,
        ]
    
    class GroupAdmin(admin.ModelAdmin):
        inlines = [
            MembershipInline,
        ]
        exclude = ('members',)
    

    Person s、 但很少 Group s、 所以对于 s、 我可以使用默认小部件,但我需要一个自定义小部件 在…内 GroupAdmin .

    我的问题是 MembershipInline ,如何修改它以使 的小部件是否被覆盖?我知道这是可能的 django-autocomplete-light 对于 ForeignKey admin.TabularInline s、 但是我该如何修改它来为 ManyToMany 管理制表符 s换句话说,如何以一种方式修改表单,而不以另一种方式修改表单?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Hameer Abbasi    7 年前

    我首先需要把 ManyToMany 桌子

    from django.db import models
    
    class Person(models.Model):
        name = models.CharField(max_length=128)
        groups = models.ManyToManyField('Group', through='Membership')
    
    class Group(models.Model):
        name = models.CharField(max_length=128)
        members = models.ManyToManyField('Person', through='Membership')
    
    class Membership(models.Model):
        person = models.ForeignKey(Person, on_delete=models.PROTECT)
        group = models.ForeignKey(Group, on_delete=models.PROTECT)
    

    然后我需要像这样创建内联:

    from django.contrib import admin
    from .models import *
    from .forms import *
    
    class MembershipInline(admin.TabularInline):
        model = Membership
        form = MembershipForm
    
    class PersonAdmin(admin.ModelAdmin):
        inlines = [
            MembershipInline,
        ]
    
    class GroupAdmin(admin.ModelAdmin):
        inlines = [
            MembershipInline,
        ]
    

    然后,在 forms.py ,

    from django import forms
    from .models import *
    
    class MembershipForm(forms.ModelForm):
        class Meta:
            model = Membership
            exclude = ()
            widgets = {
                'person': whatever_widget_i_want
            }
    

    这个 TabularInline 类将负责为我删除不需要的字段小部件。