从视图生成具有默认值的模型表单

时间:2019-06-11 11:48:48

标签: django-forms django-templates django-views

我正在编写一个简单的“议程”应用程序,用于管理事件,玩家可以在其中创建并加入表格来玩游戏。 我有两个链接的模型:事件和表。

到目前为止,我有以下这些工作: -事件的详细视图,列出了所有表,这是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函数却不能...

0 个答案:

没有答案