Я пишу простое приложение «Повестка дня» для управления событиями, где игроки могут создавать таблицы и присоединяться к ним, чтобы играть в игры.У меня есть две связанные модели: Event и Table.
Пока у меня работают следующие вещи: - подробный вид события, перечисляющий все его таблицы, есть действие ajax, позволяющее пользователям присоединяться / выходить из каждой таблицы.- простая форма (ModelForm) со связанным с ней представлением, позволяющим пользователю создать таблицу в событии
. Я хотел бы добавить к подробному виду события кнопку, которая будет запускать форму создания таблицы с событиематрибут уже установлен на это конкретное событие (и не подлежит изменению), и после отправки формы вернитесь к подробному представлению о событии
Что было бы наилучшим способом достижения этого.До сих пор я нашел только частичные отведения, которые не сработают
Я пытался добавить кнопку ajax в шаблоне сведений о событии, ссылающемся на представление создания таблицы, посылая идентификатор события, чтобыview может получить объект события.Из журнала, который я получаю, он попадает в представление создания таблицы, но функция рендеринга не вызывает шаблон создания таблицы.
Я также пытался включить шаблон формы создания таблицы в подробности событияшаблон и переместите код из представления создания таблицы в представление сведений о событии.Но затем я получаю сообщение об ошибке из функции сохранения формы, которая не может найти атрибут события в объекте экземпляра (я добавил его в методе init , с kwargs)
models.py
class Table(models.Model):
...
event = models.ForeignKey(Event,
on_delete=models.CASCADE,
related_name='tables',
null=True)
...
forms.py
class TableCreateForm(forms.ModelForm):
class Meta:
model = Table
fields = (
...
)
def __init__(self, *args, **kwargs):
self.event = kwargs.pop('event')
logger.info("save _%s_", self.event)
super().__init__(*args, **kwargs)
def save(self, *args, **kwargs):
if self.instance.pk:
return super(TableCreateForm, self).save()
instance = super(TableCreateForm, self).save(commit=False)
instance.event = kwargs.pop('event')
logger.info("save _%s_", instance.event)
instance.slug = slugify(instance.title + ' ' + str(int(instance.event.tables.order_by('slug').reverse().first().slug)+1))
instance.save()
return instance
views.py
def event_detail(request, year, month, day, event):
event = get_object_or_404(Event,
slug=event,
status='à venir',
date__year=year,
date__month=month,
date__day=day)
if request.method == 'POST':
logger.info("table_create _%s_", event.id)
table_form = TableCreateForm(data=request.POST, event=event)
logger.info("__init__ _%s_", table_form.event.id)
if table_form.is_valid():
obj = table_form.save()
obj.manager = request.user
obj.save()
messages.success(request, 'Table mise à jour '
'avec succès')
else:
messages.error(request, 'Erreur lors de la mise à jour '
'de la table')
else:
logger.info("table_create action %s, _%s_", request.method, event.id)
table_form = TableCreateForm(event=event)
logger.info("Out _%s_", request.method)
return render(request,
'agenda/event/event_detail.html',
{'event': event,
'table_form': table_form})
urls.py
urlpatterns = [
path('<int:year>/<int:month>/<int:day>/<slug:event>/',
views.event_detail,
name='event_detail'),
path('table_create/', views.table_create, name='table_create'),
]
event_detail.html
...
<table>
<tr>Nouvelle table</tr>
<tr>{% include 'agenda/table/table_create.html' %}</tr>
</table>
...
table_create.html.html
<form action="." method="post">
{{ table_form.as_table }}
{% csrf_token %}
<p><input type="submit" value="Valider"></p>
</form>
Журналы из методов инициализации и сохранения формы varegueapp_1 |ИНФОРМАЦИЯ: повестки дня. Просмотров: init 3 varegueapp_1 |ИНФОРМАЦИЯ: повестки дня: формы: СОХРАНИТЬ Нет
Функция инициализации действительно получает доступ к объекту события (event.id равен 3), но тогда функция сохранения не ...