Я использую различные 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">×</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
на уникальную кнопку, которая получает документы и открывает модал?