【发布时间】: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呈现。 -
让我们看看你的看法。