Доступ к элементам формы обновления в JavaScript - PullRequest
0 голосов
/ 30 сентября 2019

У меня есть форма для обновления найденного предмета. Форма расширяет UpdateView Django через представления. Формы для обновления потерянного элемента и для обновления найденного элемента используют один и тот же шаблон, но имеют отдельные представления и формы. Они используют один и тот же шаблон, поскольку большинство полей совпадают.

Я пытаюсь добавить некоторую пользовательскую проверку формы для формы, в частности, для обновления найденного элемента. Эта проверка относится только к найденному предмету и не применяется к потерянному предмету. У меня есть проверка в чистой функции в FoundUpdateForm, которая проверяет, были ли выполнены необходимые условия, и выдает ошибку ValidationError, если условие не выполняется. Несмотря на то, что здесь есть проверка, я хочу добавить ее и в файл JavaScript.

Я пытался создать переменные в файле JavaScript, привязанном к элементам формы, но безуспешно. Я пытался использовать var staff_type = document.getElementById('staff_type'), var staff_type = document.getElementById('FoundUpdateForm').elements.namedItem('staff_type') и несколько других вариантов этого. Основная проблема, с которой я имею дело, заключается в том, как получить форму, если у нее нет идентификатора. Я пытался присвоить форме идентификатор в файле forms.py, но по моим результатам, по крайней мере, не похоже, что это можно сделать таким образом.

Я хочу избегать добавления в шаблон столько, скольковозможно, потому что, как упоминалось ранее, этот шаблон используется несколькими формами. Кроме того, поскольку форма расширяет шаблон UpdateView, шаблон может использовать {{ form.as_p }} для визуализации полей формы с использованием тегов p. Поскольку элементы отображаются на странице таким образом, Django присваивает им каждому свой идентификатор, но самой форме не присваивается один.

forms.py:

class FoundUpdateForm(ModelForm):
    Found._meta.get_field('staff_type').formfield(widget=forms.RadioSelect())

    def clean(self):
        cleaned_data = super(FoundUpdateForm, self).clean()
        staff_type = cleaned_data.get('staff_type')
        witness = cleaned_data.get('witness')
        res_type = cleaned_data.get('res_type')
        name_of_the_individual_claiming_item = cleaned_data.get('name_of_the_individual_claiming_item')
        phone_number = cleaned_data.get('phone_number')

        if not staff_type:
            raise forms.ValidationError("Please fill out Type of Employee Resolving Item.")

        if staff_type == 'student' and not witness:
            raise forms.ValidationError("Student staff resolving lost items are required to have a witness.")

        if res_type.name == 'Picked up':
            if not name_of_the_individual_claiming_item:
                raise forms.ValidationError("If person is picking up item, the individual's name is required.")
            if not phone_number:
                raise forms.ValidationError("If person is picking up item, the individual's phone number is required.")
            if not witness:
                raise forms.ValidationError("If person is picking up item, a witness is required.")

    class Meta:
        model = Found
        fields = ['name_of_the_individual_claiming_item', 'phone_number', 'staff_type', 'witness', 'item_name', 'description', 'location', 'date_found', 'res_type', 'date_resolved']

        widgets = {
            'date_found': DateInput(attrs=date_attrs),
            'date_resolved': DateInput(attrs=date_attrs),
            'staff_type': forms.RadioSelect

        }

item_update.html:

{% extends "admin/base_site.html" %}
{% load static %}
{% load i18n %}
{% load in_group %}

{% block content %}

<script src="{% static 'lostfound.js' %}"></script>
<link rel="stylesheet" type="text/css" href="{% static 'admin/css/forms.css' %}">

<script>
$(document).ready(function() {
  $(".datepicker").datepicker({
    dateFormat: 'yy-mm-dd',
  });

});
</script>

<fieldset class="well">
    <form action="" method="post">{% csrf_token %}
        {{ form.as_p }}
        <input class="btn btn-primary" type="submit" value="Update" />
    </form>
</fieldset>


{% endblock content %}

views.py:

class FoundUpdate(UpdateView):
    model = Found
    template_name = 'lostfound/item_update.html'
    success_url = reverse_lazy('found_list')
    form_class = FoundUpdateForm

    def form_valid(self, form):
        item = form.save()
        LogEntry.objects.create(
                user_id         = self.request.user.pk,
                content_type_id = ContentType.objects.get_for_model(Found).pk,
                object_id       = item.pk,
                object_repr     = item,
                action_flag     = 2,
                change_message  = 'Update Found Item'
            )

        return redirect('found_list')

    def get_context_data(self, **kwargs):
        context = super(FoundUpdate, self).get_context_data(**kwargs)
        context['title'] = 'Change found'
        context['log_entries'] = get_object_history_list(self.model, self.get_object().pk)
        return context

Примечание: я использую Django 1.11

1 Ответ

0 голосов
/ 01 октября 2019

Оберните форму в <div> и задайте этому классу div, скажем, <div class="MySpecialForm">. Затем вы можете найти (сгенерированную django) форму, обратившись к форме внутри div с этим конкретным классом (и, если вы хотите пуленепробиваемую, проверить, что она уникальна). В общем, перенос чего-либо в div не влияет на его отображение, если только классы div не являются чем-то особенным (например, Bootstrap). $('div.MySpecialForm form') (Или что-то близкое, я не делаю селекторы JQuery достаточно часто, чтобы быть источником знаний о них!)

Вам это не нужно, если на странице может быть> 1 форма,но если вы пытаетесь написать JS, который является как можно более общим, вы действительно должны учесть эту возможность.

Вы должны также рассмотреть шаблоны и под-шаблоны, используя базовый шаблон, который определяет часть, инвариантную сотносительно любого отдельного представления и некоторых пустых блоков (или блоков, отображающих «Ошибка программирования, вы забыли переопределить блок foobar»). Под-шаблоны делают

{% extends "wherever / what.html"%} {% block что-то%} stuff {% endblock что-то%} {% blockthing_else%} и т. Д. *

И это аккуратно отделяет специфику одного представления от обобщений определенного вида представления.

...