【问题标题】:Multiple Comment Forms on One Page in One Template - Django一个模板中的一页上的多个评论表单 - Django
【发布时间】:2015-07-15 21:43:16
【问题描述】:

我对此进行了研究,许多答案都涉及到它(表单集、前缀等),但没有一个正是我所追求的......

我有一个应用程序,允许用户将卡片张贴到板上,每张卡片可以有零个或多个 cmets。我已经设置了数据库关系,所以如果我手动添加板、卡或评论对象,我可以在模板中显示它们就好了。

卡片表格也可以使用,所以这不是问题。但现在我想用click 事件(我使用jQuery)显示评论textarea。问题是,表单没有显示该字段。这是表单代码:

class AddCommentForm(ModelForm):
    class Meta:
        model = Comment
        fields = ['message']

    message = forms.CharField(
        widget=forms.Textarea(
            attrs={
                'class': 'form-control comment-input'
                'name': 'message',
                'placeholder': 'Comment away...'
            }
        ),
        required=False,
    )

马上就有一个问题,当 Django 渲染一个表单时,它使用了一个id。在这种情况下,它最终是id_message 或message(取决于我是否在表单类中指定)。当然,在 HTML 中,这是不好的。我在 shell 中确认了这一点:

>>> import django; import project
>>> from apps.board.forms import AddCommentForm
>>> comment_form = AddCommentForm(); print(comment_form)
<tr><th><label for="message">Message:</label></th><td><textarea class="form-control comment-input" cols="40" id="message" name="message" placeholder="Comment away..." rows="10">
</textarea></td></tr>

所以我想到了使用formsets,但似乎不太正确,因为据我了解,它们用于一个form 标签内的多种形式。我的情况不同,因为每张卡片都有零个或多个 cmets,并且 HTML 的流程规定应该有几个 form 元素。

另一个挑战是我需要有两个视图:一个处理卡片,一个处理每个评论。我目前正在使用不同的操作值来完成此操作,并且似乎有效。

似乎我的用例并没有那么奇怪,我可以想到几种会发生这种情况的情况:Twitter 回复、博客帖子上的 cmets 等。我只是无法让 Django 使用它.

我还应该注意,我可以手动使用此功能:

<label>
    <textarea class="form-control comment-input" name="message"></textarea>
    <button type="submit"></button>
</label>

更新

这是一个视图片段:

class AddCommentView(View):

    model = Comment
    form_class = AddCommentForm
    template_name = 'somedir/template.html'

    @method_decorator(login_required)
    def get(self, request):

        comment_form = self.form_class()

        return render(request, self.template_name, {
            'comment_form': comment_form
        })

如果表单正常工作(来自上面的 sn-p 和 shell 测试),我希望它会显示在页面上。

URLConf 在这里:

url(r'^comment/add/$', AddCommentView.as_view(), name='add_comment_view'),

在写这篇文章时,我看到了一个令人困惑的部分。我的视图 URL 是 /comment/add/,但我希望表单呈现在 /dashboard/。问题是那个 URL 已经有另一个视图了。

如果我在没有 Django 表单的情况下构建表单,则将数据发布到 /comment/add/ 评论被创建并保存在数据库中。所以我想我仍在试图弄清楚如何在一个模板中使用多个表单中的两个视图。 @Daniel Roseman 指出了 prefix 的用法,我想这值得进一步探索。

更新 2

所以我通过删除该视图的 URL 并将视图组合到一个视图中来使用前缀来实现这一点。两种形式,一种视图,一种模板。但是……

源仍然显示复制ids。我最终没有将id 放入表单属性列表中。由于这是无效的 HTML,解决此问题的最佳方法是什么?

在我看来:

card_model = Card
comment_model = Comment

card_form_class = AddCardForm
comment_form_class = AddCommentForm
. . .
@method_decorator(login_required)
def get(self, request):

    card_form = self.card_form_class(prefix='card')
    comment_form = self.comment_form_class(prefix='comment')
    . . .

更新 3

我已经找到了解决这个问题的方法。实例化表单,需要添加auto_id=False防止多个,复制ids:

comment_form = self.comment_form_class(prefix='comment', auto_id=False)

【问题讨论】:

  • 我很困惑,你说表单没有被渲染,然后你说它用id_message渲染它。它是哪一个?另外,id 为 id_message 的问题是什么?
  • 嗯,有几件事...我没有说它是用id 渲染的。我说最终是......我知道 Django 做了什么,因为我在其他地方使用它的形式。其次,我通过在 shell 中的测试证实了这一点。为了清楚起见,我将把它添加到问题中。 ids 的问题在于,在 HTML 中你只能有一个 id,因此表单会在多个 forms 中使用相同的 id 呈现。
  • 让我们看看你的看法。

标签: django forms comments


【解决方案1】:

您可以在实例化表单时使用prefix 参数来为它们提供不冲突的ID。

【讨论】:

  • 参考文献说:“您可以将多个 Django 表单放在一个 &lt;form&gt; 标记中。要为每个表单提供自己的命名空间,请使用前缀关键字参数 [...]”这是否适用于多个forms?我问是因为我玩弄前缀有点无济于事。有几篇关于这个主题的帖子。
  • 你使用多少&lt;form&gt;标签根本没有区别。如果您遇到问题,您应该显示您尝试过的代码以及您遇到的错误。
  • 好的,没关系。我正在用更多代码更新问题。谢谢。
  • 所以我使用前缀让它工作,但源仍然显示复制ids。我最终没有将 id 放入表单属性列表中。由于这是无效的 HTML,解决此问题的最佳方法是什么?
【解决方案2】:

虽然使用 Django 表单 prefix 部分正确(感谢 @Daniel Roseman),但关于我拥有多少表单元素并不重要的断言并不完全正确。这很重要,因为默认情况下,前缀旨在以一种形式使用(因为它会创建多个复制 ids)。要以多种形式使用它,您还需要auto_id=False。这可以防止 Django 表单生成 id。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 2010-10-08
    • 2011-12-12
    • 2012-07-05
    • 1970-01-01
    相关资源
    最近更新 更多