Django: Как создать представление для обновления нескольких записей в промежуточной модели с отношением "многие ко многим через"?

Я новичок в Django и создаю сайт RSVP для обработки нескольких событий и отслеживания гостей на этих событиях. У меня есть модель для гостя, для события и промежуточная модель для гостя. Я хотел бы, чтобы страница проходила по каждому гостевому событию для гостя и позволяла мне обновлять поля посещаемости, взрослых и детей в гостевом событии. Мне никогда не понадобится создавать или удалять эти поля через интерфейс.
В настоящее время я пытаюсь использовать основанный на классе UpdateView, но могу легко переключиться на другое представление. Я пытался использовать django-betterforms и django-extra-views, но мне тоже не повезло. Я также сделал несколько попыток следовать учебникам для наборов форм и встроенных наборов форм, но безуспешно. Мои модели выглядят так:

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 ответ

Решение

Я думаю, что сейчас это работает в основном с 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>
Другие вопросы по тегам