Django:如何创建一个视图来更新具有多对多关系的中间模型上的多个记录?

时间:2016-06-04 20:58:20

标签: python django many-to-many django-intermediate-table

我是Django的初学者,我正在创建一个RSVP站点来处理多个事件并跟踪客人对这些事件的看法。我有 Guest 的模型, Event 的模型,以及 GuestEvent 的中间模型。我想要一个页面遍历每个 GuestEvent 以获取 Guest 并允许我更新参加成人 GuestEvent 中的 children 字段。我永远不需要通过前端创建或删除这些字段 我目前正在尝试使用基于类的UpdateView,但可以轻松切换到不同的视图。我曾尝试使用django-betterforms和django-extra-views,但两者都没有运气。我还尝试了一些关于formset和内联formset的教程但没有成功。 我的模型看起来像这样:

class Event(models.Model):
    name = models.CharField(max_length=200)
    description = models.TextField(null=True, blank=True)
    date = models.DateTimeField('event date')
    guests = models.ManyToManyField('Guest', through='GuestEvent')

class Guest(models.Model):
    first_name = models.CharField(max_length=45, null=True, blank=True)
    last_name = models.CharField(max_length=45, null=True, blank=True)
    events = models.ManyToManyField('Event', through='GuestEvent')

class GuestEvent(models.Model):
    guest = models.ForeignKey('Guest', related_name='guests')
    event = models.ForeignKey('Event', related_name='events')
    attending = models.NullBooleanField()
    adults = models.IntegerField(null=True, blank=True)
    children = models.IntegerField(null=True, blank=True)

在某种更新视图中获取这些中间记录的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

我想我现在主要使用Django-Extra-Views。 我的观点如下:

class GuestEventInline(InlineFormSet):
    model = GuestEvent
    fields = [ 'attending', 'adults', 'children' ]
    extra = 0
    can_delete=False

class Invite2View(UpdateWithInlinesView):
    template_name = "weddings/invite2.html"
    model = Guest
    inlines = [ GuestEventInline ]

我的模板看起来像这样:

<form action="" method="post" class="form-horizontal">
    {% csrf_token %}
    {{ form }}        
    {% for formset in inlines %}
        {{ formset.id }}
        {{ formset.management_form}}
        {%for subform in formset%}
            <h4>{{ subform.instance.event }}</h4></a>
            {{ subform.as_p }}
        {% endfor %}
    {% endfor %}
    {% buttons submit='Save' %}{% endbuttons %}
</form>