我正在编写一个简单的“议程”应用程序,用于管理事件,玩家可以在其中创建并加入表格来玩游戏。 我有两个链接的模型:事件和表。
到目前为止,我有以下这些工作: -事件的详细视图,列出了所有表,这是ajax动作,允许用户加入/退出每个表。 -具有相关视图的简单表单(ModelForm),允许用户在事件中创建表
我想在事件详细信息视图中添加一个按钮,该按钮将启动表创建表单,并将event属性设置为该特定事件(并且不可更改),一旦提交表单,就返回到活动详细信息视图
实现此目标的最佳方法是什么。 到目前为止,我只发现了部分线索,不会做任何事情
我尝试在事件详细信息模板中添加一个ajax按钮,该按钮链接到表创建视图,并随事件ID一起发送,以便该视图可以获取事件对象。从我得到的日志中,它确实进入了创建表视图,但是render函数没有弹出创建表模板。
我还尝试将表创建表单模板包括在事件详细信息模板中,并将代码从创建表视图移至事件详细信息视图。但是然后我从表单的保存函数中收到一条错误消息,该消息无法在实例对象中找到事件属性(我已经在 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>
从表单的init和save方法记录日志 varegueapp_1 | INFO:agenda.views:初始化 3 varegueapp_1 | INFO:agenda.forms:保存无
init函数确实可以访问事件对象(event.id为3),但是save函数却不能...