Nano Hash - криптовалюты, майнинг, программирование

Использование средства выбора даты jQuery с несколькими формами django на одной странице

Итак, у меня есть форма создания объявления, а затем форма редактирования для каждого объявления, и каждая форма имеет свой собственный указатель даты. Моя функция для управления средством выбора даты:

$(function() {
    $( ".datepicker" ).datepicker({
        changeMonth: true,
        changeYear: true,
    });
});

Первоначально моя проблема заключалась в том, что использование средства выбора даты в одной из форм редактирования изменит поле в форме создания, поскольку идентификаторы были одинаковыми. Я обошел это, добавив идентификаторы (в моем 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, идентификаторы, классы и все такое. Каждая форма редактирования находится в div с уникальным идентификатором, но сами поля формы называются одинаково во всех формах. Кто-нибудь знает, как я могу генерировать уникальные идентификаторы для полей формы с помощью настроек виджета django? Или, может быть, есть какой-то javascript или что-то еще, что я мог бы добавить в свою функцию выбора даты, которая сообщает средству выбора даты изменить значение поля, которое находится в том же 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>

Итак, чтобы уточнить, в каждом div editann-# есть форма редактирования (и каждая форма редактирования имеет средство выбора даты). Прямо сейчас, поскольку все поля формы редактирования «Expire» имеют идентификатор id_end_date, средство выбора даты изменяет значение первой формы редактирования, независимо от того, какое средство выбора даты я использую.


  • в чем именно проблема? Покажите свой обработанный html и части формы, к которым вы хотите применить js datepicker, и те, к которым вы не хотите, чтобы он применялся. 26.07.2016
  • @YPCrumble Я добавил свой код шаблона и сгенерировал HTML, помогает ли это прояснить проблему? 26.07.2016
  • каков желаемый результат? Вы хотите, чтобы второе поле Expires стало средством выбора даты, а не первым? Или что-то другое? Извините, все еще не могу понять, в чем проблема. 26.07.2016
  • Нет, поэтому в каждой форме, когда я щелкаю область ввода текста, появляется средство выбора даты (это то, что я хочу), но затем, когда я выбираю дату, моя функция выбора даты заполняет значение первой формы редактирования. Скажем, у меня на странице 3 объявления, и я хочу отредактировать срок действия третьего. Я нажимаю кнопку редактирования, блок редактирования объявления становится невидимым, я помещаю курсор в поле истечения срока действия, и появляется средство выбора даты, я выбрал дату, но затем эта дата появляется в форме редактирования первого объявления, а не третьего. Поэтому мне нужен способ связать каждое средство выбора даты с правильной формой @YPCrumble. 26.07.2016

Ответы:


1

Я придумал решение, включающее некоторые javascript и jQuery.

function unhide_announcement(divID, ID) {
var item = document.getElementById(divID);
if (item) {
    /* hide/unhide div */
    item.className=(item.className=='hidden')?'unhidden':'hidden';
    /* give each end_date field a unique ID */
    var newID = 'id_end_date' + ID;
    item.querySelector('#id_end_date').id = newID;
    /* datepicker functionality */
    $(function() {                                                    
        $( '#'+newID ).datepicker({
          changeMonth: true,
          changeYear: true,
        });
      })
    }
}

Поскольку каждая форма объявления о редактировании находится в уникальном div, я сначала получаю этот div, а затем внутри div есть только 1 форма объявления о редактировании, поэтому я меняю этот идентификатор с id_end_date на id_end_date1 или на любой другой идентификатор объявления, с которым он связан. А затем я изменил функцию выбора даты jQuery, которую мне пришлось выбирать по идентификатору, а не по классу, и это сработало. Поэтому, когда я вызываю его в своем шаблоне, он выглядит так:

<a href="javascript:unhide_announcement('editann-{{announcement.id}}', '{{announcement.id}}')" class="btn btn-primary">Edit</a>
<div id="editann-{{announcement.id}}" class="hidden">
    <!-- edit announcement form -->
    <form>
        ...
    </form>
</div>
04.08.2016

2

У вас не должно быть двух одинаковых id на одной странице. ID должен быть уникальным. Вот что создает ошибку.

Чтобы добавить более одной формы на страницу, используйте Formsets, которые автоматически гарантируют уникальность вашего идентификатора.

Удалив атрибут id из вашего кода, я смог заставить работать средства выбора даты. См. эту рабочую скрипту.

Обратите внимание, что мне пришлось удалить класс hasDatepicker из html, который вы вставили, поскольку он фактически вставлен функцией datepicker - если вы оставите его, это создаст конфликт, и средство выбора даты не появится.

26.07.2016
  • Я знаю, что идентификаторы должны быть уникальными, но настройки виджета django автоматически генерируют HTML (включая идентификаторы). Вот почему я спросил, знает ли кто-нибудь, как создавать уникальные с помощью настроек виджета. Я показываю объявления в цикле for, поэтому для каждого объявления выполняется одно и то же. 27.07.2016
  • @Catherine, поскольку у вас здесь два цикла, вы можете использовать forloop.counter с parentloop.counter, чтобы сделать идентификаторы уникальными. 27.07.2016
  • это звучит полезно, но у меня возникли проблемы с его реализацией в моем шаблоне, я попытался заменить {{ field }} на {{ field|attr:"id:end_date_edit-{{forloop.parentloop.counter}}" }}, но это выдает ошибку TemplateSyntaxError: attr требует 2 аргумента, 1 предоставлен. Ваше предложение просто изменяет метку для идентификатора, а не фактический идентификатор поля формы. 27.07.2016
  • @Catherine, извините, вы должны использовать набор форм, чтобы убедиться, что идентификаторы уникальны для вас. 27.07.2016
  • В итоге я написал некоторый javascript, который принимает divID и идентификатор объявления в качестве параметров и изменяет идентификатор поля формы истечения срока действия с id_end_date на id_end_date + ID, но теперь, когда я пытаюсь использовать средство выбора даты, я получаю сообщение об ошибке. Отсутствуют данные экземпляра для этого средства выбора даты, так что вы знаете как я могу изменить функцию выбора даты для обработки идентификаторов вместо классов? У меня нет опыта работы с jQuery, я скопировал функцию, поэтому не знаю, как ее изменить. 27.07.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..