【发布时间】:2016-11-30 10:51:40
【问题描述】:
所以我有一个创建公告表单,然后为每个公告创建一个编辑表单,每个表单都有自己的日期选择器。我控制日期选择器的功能是:
$(function() {
$( ".datepicker" ).datepicker({
changeMonth: true,
changeYear: true,
});
});
最初我的问题是在其中一个编辑表单中使用日期选择器会更改创建表单中的字段,因为 ID 相同。我通过添加 id(在我的 forms.py 中)来解决这个问题:
end_date = forms.DateField(label='Expires', widget=forms.TextInput(attrs={'class':'datepicker form-control', 'id':'end_date_create'}))
和
end_date = forms.DateField(label='Expires', widget=forms.TextInput(attrs={'class':'datepicker form-control', 'id':'end_date_edit'}))
到我的 createAnnouncement 和 EditAnnouncement 表单。但由于我每页有多个编辑表单,我仍然遇到同样的问题,即在任何编辑表单上使用日期选择器只会更改顶部编辑表单的字段。我正在使用 django 小部件调整来呈现我的表单,因此它会自动生成 HTML 和 ids 和类以及所有内容。每个编辑表单都在一个具有唯一 id 的 div 中,但表单字段本身在所有表单中都被命名为相同的东西。有谁知道如何使用 django 小部件调整为我的表单字段生成唯一 ID?或者也许有一些 javascript 或者我可以添加到我的 datepicker 函数中,告诉 datepicker 更改同一 div 中字段的值?
编辑:我的模板如下所示:
{% if boardAnnouncements %}
<h3>Announcements</h3>
<div class="container" style="margin: 0px; padding: 0px;">
<ul>
{% for announcement in boardAnnouncements %}
<div class="row" style="padding-bottom: 10px;">
<li>
<div class="col-md-6">
<!-- display announcement content -->
</div>
<div class="col-md-6">
<!-- edit button calls javascript function to hide/unhide div with edit form in it -->
<a href="javascript:unhide_announcement('editann-{{announcement.id}}', '{{announcement.id}}')" class="btn btn-primary" style="margin-left: 10px;"><i class="fa fa-pencil" aria-hidden="true"></i> Edit</a>
</div>
</div>
<!-- each div gets unique id that corresponds to announcemt id -->
<div id="editann-{{announcement.id}}" class="hidden">
<form role="form" action="/editannouncement/{{announcement.id}}/" method="post">
<!-- display edit form with django widget tweaks -->
{% csrf_token %}
{% for field in editAnnouncement %}
{% if field.errors %}
<div class="form-group has-error">
<label class="col-sm-2 control-label" for="id_{{ field.name }}">
{{ field.label }}</label>
<div class="col-sm-10">
{{ field }}
<span class="help-block">
{% for error in field.errors %}
{{ error }}
{% endfor %}
</span>
</div>
</div>
{% else %}
<div class="form-group">
<label class="col-sm-2 control-label" for="id_{{ field.name }}">{{ field.label }}</label>
<div class="col-sm-10">
{{ field }}
{% if field.help_text %}
<p class="help-block"><small>{{ field.help_text }}</small></p>
{% endif %}
</div>
</div>
{% endif %}
{% endfor %}
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" name="edit_announcement" class="btn btn-primary">Save</button><br><br>
</div>
</div>
</form>
</li>
</div>
{% endfor %}
</ul>
</div>
{% endif %}
<div>
并且为编辑表单生成的 HTML 是:
<div id="editann-1" class="unhidden">
<form class="ng-pristine ng-valid" role="form" action="/editannouncement/1/" method="post">
<input name="csrfmiddlewaretoken" value="AbTEZYmK1RF9yeom1C34IFFCj3EBrOD3" type="hidden">
<div class="form-group">
<label class="col-sm-2 control-label" for="id_description">Edit Description</label>
<div class="col-sm-10">
<textarea class="form-control" cols="40" id="id_description" name="description" rows="10"></textarea>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label" for="id_end_date">Expires</label>
<div class="col-sm-10">
<input class="datepicker form-control hasDatepicker" id="end_date_edit" name="end_date" type="text">
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" name="edit_announcement" class="btn btn-primary">Save</button><br><br>
</div>
</div>
</form>
</div>
<div id="editann-2" class="unhidden">
<form class="ng-pristine ng-valid" role="form" action="/editannouncement/2/" method="post">
<input name="csrfmiddlewaretoken" value="AbTEZYmK1RF9yeom1C34IFFCj3EBrOD3" type="hidden">
<div class="form-group">
<label class="col-sm-2 control-label" for="id_description">Edit Description</label>
<div class="col-sm-10">
<textarea class="form-control" cols="40" id="id_description" name="description" rows="10"></textarea>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label" for="id_end_date">Expires</label>
<div class="col-sm-10">
<input class="datepicker form-control hasDatepicker" id="end_date_edit" name="end_date" type="text">
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" name="edit_announcement" class="btn btn-primary">Save</button><br><br>
</div>
</div>
</form>
</div>
所以为了澄清每个editann-# div 里面都有一个编辑表单(每个编辑表单都有一个日期选择器)。现在,由于所有编辑表单“过期”字段的 id 为 id_end_date,因此无论我使用哪个日期选择器,日期选择器都会更改第一个编辑表单的值。
【问题讨论】:
-
究竟是什么问题?显示您呈现的 html 以及您希望将 datepicker js 应用于的表单部分以及您不希望将其应用于的表单部分。
-
@YPCrumble 我已经添加了模板代码并生成了 HTML,这有助于澄清问题吗?
-
想要的结果是什么?您希望第二个“过期”字段成为日期选择器而不是第一个?或者是其他东西?抱歉,仍然无法理解实际问题是什么。
-
不,所以当我单击文本输入区域时,每个表单都会显示 datepicker(这是我想要的),但是当我选择一个日期时,我的 datepicker 函数会填写第一个编辑表单的值.假设我的页面上有 3 条公告,我想编辑第三条的到期日期。我单击编辑按钮,编辑公告 div 被取消隐藏,我将光标放在过期字段中,日期选择器出现,我选择了一个日期,但该日期出现在第一个公告的编辑表单中,而不是第三个。所以我需要一种方法将每个日期选择器与正确的表单@YPCrumble 相关联
标签: javascript jquery django datepicker django-widget