Django admin多对多SUB

2024-06-08 18:58:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试在Django admin中集成以下三个相关模型:

# models.py
class Seminar(models.Model):
    title = models.CharField(max_length=128, unique=True)
    start_date = models.DateField(db_index=True)
    end_date = models.DateField(db_index=True)


class Event(models.Model):
    title = models.CharField(max_length=128)
    start_date = models.DateTimeField(db_index=True)
    end_date = models.DateTimeField(db_index=True)
    seminar = models.ForeignKey('Seminar')


class Registration(models.Model):
    name = models.CharField(max_length=128)
    first_name = models.CharField(max_length=128)
    seminar = models.ForeignKey('Seminar')
    events = models.ManyToManyField('Event', null=True)


# admin.py
class EventInline(admin.TabularInline):
    model = Event


class SeminarAdmin(admin.ModelAdmin):
    list_display = ('title', 'start_date', 'end_date')
    inlines = [
        EventInline,
    ]


class RegistrationAdmin(admin.ModelAdmin):
    list_display = ('seminar', 'name', 'first_name')

如您所见,每个研讨会可能有多个事件,从Seminar管理添加为内联条目。在

我的问题是注册,因为它们是:

  • 与研讨会有关
  • 可以“订阅”本次研讨会的多个活动

当然,管理员会列出所有事件,而不是与研讨会相关的子集,因此:

  • 是否有可能实现这一点从管理员(与尽可能低的微调)?在
  • Event上的RegistrationM2M是否合适,或者我应该以不同的方式将这两个模型关联起来?在

谢谢!在


Tags: nameeventtruedbdateindexmodeladmin
1条回答
网友
1楼 · 发布于 2024-06-08 18:58:09

好吧,在问这个问题之前,我做了一些类似于Django的auth.User模型的工作,使用了不同的表单来添加/更改视图。我希望有更好的解决办法,显然不是。在

下面是我所做的: 在

# models.py
class Registration(models.Model):
    # [...] - add form excludes it, should allow blank on events field
    events = models.ManyToManyField('Event', blank=True, null=True)


# admin.py
class RegistrationAdmin(admin.ModelAdmin):
    change_form = RegistrationChangeForm

    def get_form(self, request, obj=None, **kwargs):
        defaults = {}
        if obj is None:
            defaults.update(exclude=('events',))
        else:
            defaults.update(form=self.change_form)
        defaults.update(kwargs)
        return super(RegistrationAdmin, self).get_form(request, obj, **defaults)


# forms.py
class RegistrationChangeForm(forms.ModelForm):
    class Meta:
        model = Registration
        exclude = ('seminar',)

    def __init__(self, *args, **kwargs):
        super(RegistrationChangeForm, self).__init__(*args, **kwargs)
        self.fields['events'].choices = Event.objects.filter(seminar=kwargs.get('instance').seminar).values_list('pk','title')

因此,添加时,我们只需忽略事件(注册与空事件一起保存),然后,在更改时,可以根据先前定义的研讨会选择一个事件列表,然后将其忽略(因为我们无法重新加载相关事件列表)。在

相关问题 更多 >