Обработка форм POST / GET с помощью Django и Bootstrap Modal - PullRequest
0 голосов
/ 25 октября 2018

Я использую различные forms (POST и GET) в моем Django веб-приложении и Bootstrap modal для этого.

В моем шаблоне пользователь может выбрать несколько документов, отправьте список документов, которые подобраны к форме Django (CustomerForm) в моем модалеЭтот CustomerForm позволяет отправить электронное письмо с ранее заполненной пользовательской информацией.

Мой CustomerForm выглядит следующим образом:

class CustomerForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super(CustomerForm, self).__init__(*args, **kwargs)
        self.fields['country'].empty_label = _('Select a country')
        self.fields['country'].queryset = self.fields['country'].queryset.order_by('name')
        self.fields['email'].required = True
        self.fields['first_name'].required = True
        self.fields['last_name'].required = True
        self.fields['country'].required = True
        self.fields['institution'].required = False

    class Meta:
        model = Customer
        fields = ['email', 'first_name', 'last_name', 'country', 'institution']
        widgets = {
            'email': forms.TextInput(attrs={'placeholder': _('name@example.com')}),
            'first_name': forms.TextInput(attrs={'placeholder': _('First Name')}),
            'last_name': forms.TextInput(attrs={'placeholder': _('Last Name')}),
            'institution': forms.TextInput(attrs={'placeholder': _('Agency, company, academic or other affiliation')}),
        }

У меня есть файл views.py:

class HomeView(CreateView, FormView):
    """ Render the home page """

    template_name = 'index.html'
    form_class = CustomerForm

    def get_context_data(self, **kwargs):

        # display some things 
        # ...

        if "DocumentSelected" in self.request.GET:
            checkbox_list = self.request.GET.getlist('DocumentChoice')
            document = Document.objects.filter(id__in=checkbox_list)
            kwargs['selected_document'] = document

        return super(HomeView, self).get_context_data(**kwargs)

    def form_valid(self, form):
        email = form.cleaned_data['email']
        country = form.cleaned_data['country']

        for checkbox in self.request.GET.getlist('DocumentChoice'):
            document = Document.objects.get(id=checkbox)
            token = self.gen_token(email)

            now = timezone.now()
            expiration = now + settings.DOWNLOAD_VALIDITY
            Download.objects.create(email=email, country=country, doc_id=checkbox, token=token,
                                    expiration_date=expiration)

            self.send_email(email, document.upload, document.publication.title, token)

        return super(HomeView, self).form_valid(form)

И, наконец, в моем HTML-шаблоне вы можете найти что-то похожее на это:

<form method="GET" action="">

    <!-- Table with checkboxes - User has to check wanted objects -->

    <div class="row">
        <div class="col-md-offset-3 col-md-4">
            <input type="submit" class="btn btn-default" name="DocumentSelected" value="{% trans 'Save document(s)' %}"/>
            <input type="button" class="btn btn-default" data-toggle="modal" data-target="#myModal" value="{% trans 'Send document(s)' %}"/>
        </div>
    </div>
</form> 

<!-- Modal -->
  <div class="modal fade" id="myModal" role="dialog">
    <div class="modal-dialog">

      <!-- Modal content-->
      <div class="modal-content">
        <div class="modal-header">
          <button type="button" class="close" data-dismiss="modal">&times;</button>
          <h4 class="modal-title">{% trans 'Your informations' %}</h4>
        </div>
        <form method="post" action="" novalidate>
          {% csrf_token %}
          <div class="modal-body">
            <div class="row">
              <div class="col-md-12">
                {{ form.email|as_crispy_field }}
              </div>
            </div>

            <div class="row">
              <div class="col-md-6">
                {{ form.first_name|as_crispy_field }}
              </div>
              <div class="col-md-6">
                {{ form.last_name|as_crispy_field }}
              </div>
            </div>

            <div class="row">
              <div class="col-md-6">
                {{ form.country|as_crispy_field }}
              </div>
              <div class="col-md-6">
                {{ form.institution|as_crispy_field }}
              </div>
            </div>
          </div>
          <div class="modal-header">
            <h4 class="modal-title">{% trans 'Your cart' %}</h4>
          </div>
          <div class="model-body">
            {% for element in selected_document|dictsort:'format' %}
              <!-- Display wanted objects -->
            {% endfor %}
          </div>
          <div class="modal-footer">
            <input type="submit" class="btn btn-default" data-dismiss="modal" value="{% trans 'Send' %}"/>
          </div>
        </form>
      </div>
    </div>
  </div>

Процесс:

Это необходимый способ:

  • Пользователь должен проверить один или несколько документов
  • Пользователь отправляет выбор, и открывается модальное окно, содержащее CustomerForm.
  • Пользователь заполняет поля CustomerForm и видит в Cart part свои документы
  • Пользователь отправляет CustomerForm и отправляет электронное письмо с предыдущими сведениями / документами.

Я думаю, что мой метод может работать, но я не могу вызвать функцию form_valid иЯ хотел бы правильно написать этот класс.

Конечно, есть отвратительные проблемы, и я заранее прошу прощения.Но это не лучший способ улучшить себя и не воспроизводить эти проблемы?;)

Спасибо!

РЕДАКТИРОВАТЬ:

Я сделал что-то, что, кажется, работает.Я удалил data-dismiss="modal" из моей модальной кнопки отправки.Я прочитал, что этот атрибут закрыл мой модал и не опубликовал никакой формы!Наконец, это хороший способ сделать то, что я сделал?

Можно ли заменить обе кнопки Save documents и Send documents на уникальную кнопку, которая получает документы и открывает модал?

1 Ответ

0 голосов
/ 26 октября 2018

Я сделал что-то, что, кажется, работает.Я удалил data-dismiss = "modal" из моей модальной кнопки отправки.

Ранее:

<input type="submit" class="btn btn-default" data-dismiss="modal" value="{% trans 'Send' %}"/>

Сейчас:

<input type="submit" class="btn btn-default" value="{% trans 'Send' %}"/>

Работает сейчас!Это было потому, что data-dismiss="modal" закрыл модал, а я этого не знал.

...