У меня есть три модели User
(django.contrib.auth), Screening
и User_Screening
. User_Screening
- таблица m2m с дополнительным полем status
.Django: одна и та же форма несколько раз в одном виде
#models.py
from django.db import models
from django.contrib.auth.models import User
class Screening(models.Model):
title = models.CharField(max_length=255)
start = models.DateTimeField()
user_relation = models.ManyToManyField(User, blank=True,
through='User_Status')
class User_Status(models.Model):
ATTENDING = 'c'
NOT_ATTENDING = 'n'
PROJECTION = 'p'
STATUS_CHOICES = (
(ATTENDING, 'attending'),
(NOT_ATTENDING, 'not attending'),
(PROJECTING, 'projecting'),
)
screening = models.ForeignKey(Screening)
user = models.ForeignKey(User)
status = models.CharField(max_length=1, choices=STATUS_CHOICES)
Теперь я хочу сделать вид, который показывает все предстоящие показы. До сих пор так легко:
#views.py
@login_required()
def index(request):
current_screenings = Screening.objects.filter(start__gte=timezone.now())
context = {'current_screenings': current_screenings}
return render(request, 'schedule/index.html', context)
С этой точки зрения зарегистрированных пользователей должны иметь возможность, чтобы обновить их status
(от User_Screening
таблицы). Также может быть, что у пользователя еще нет записи для этого скрининга, поэтому нужно создать.
Я не понимаю, как я мог архивировать поле выпадающего списка формы для каждого экрана, где пользователь может выбрать свой статус. (Либо ?
если не статус не установлен еще, attending
, not attending
или projection
)
Из того, что я понимаю, что нужно несколько форм, которые знают, что скрининг они связаны.
Кроме того, Formsets, похоже, не работает, потому что я не всегда могу заполнить форму исходными данными, так как на некоторых или всех экранах могут отсутствовать записи. Кроме того, я не знаю, какая форма относится к какому из экранирующих объектов.
Update: То, что я хочу, чтобы в конечном итоге в HTML-то вроде этого:
<form>
<h1>Current Screening 1</h1>
<select onchange="submit()" name="screening_user" id="s1">
<option value="att">Attending</option>
<option value="not_att">Not Attending</option>
<option selected="selected" value="pro">Projection</option>
</select>
<h1>Current Screening 2</h1>
<select onchange="submit()" name="screening_user" id="s2">
<!-- The 'Please Select' option is only visible, if the user does not
have a relation in 'User_Screening' for this screening -->
<option selected="selected" value="none">Please Select</option>
<option value="att">Attending</option>
<option value="not_att">Not Attending</option>
<option value="pro">Projection</option>
</select>
<!-- More Screenings -->
<h1>Current Screening n</h1>
<!-- select for screening n -->
</form>
Поэтому изменение количества форм требуется, из одной и той же формы с предварительно загруженными данными в соответствии с зарегистрированным в пользователе.
Ладно, я мог бы уточнить, что есть больше, чем просто 'status'«наступающий»и«не придет». Я сократил их для этого вопроса. Кроме того: если у меня есть отношение к статусу «не придет», я знаю, что пользователь активно решил не приезжать, что мне действительно нужно, для целей напоминания по электронной почте. –