Редактирование данных в базе данных, которые были записаны без формы
В моем проекте есть форма и таблица с чекбоксами, на основе данных, введенных в форму и чекбоксы, я заполняю 2 базы данных и перенаправляю пользователя на страницу, где отображается информация из одной таблицы, все работало очень хорошо, пока я не дошел до редактирования записей, я решил сделать это с помощью UpdateView
, передав в template_name тот же шаблон, что и до добавления записей:
вот функция добавления и класс редактирования:
class CampaignEditor(UpdateView):
model = Campaigns
template_name = 'mailsinfo/add_campaign.html'
form_class = CampaignsForm
def add_campaign(request):
if request.method == 'POST':
addCampaignDataToDB(request.POST)
data = list(Emails.objects.values())
data = MailsTableWithoutPass(data)
form = CampaignsForm()
data_ = {
'form': form,
'data': data
}
return render(request, 'mailsinfo/add_campaign.html', data_)
Но при вызове url для изменения моя таблица данных пуста и в ней нет выбранных флажков, вся обработка формы работает нормально
Вот шаблон, который я использую, и функция, которая записывает данные в таблицы:
<div>
<div class="container-campaign">
<div class="campaign-form">
<form method="post" id="newCampaign">
{% csrf_token %}
{{ form.name }}<br>
{{ form.subject }}<br>
{{ form.body }}<br>
{{ form.user_guid }}<br>
</form>
</div>
<div class="campaign-table">
<table
id="table"
data-height="480"
class="table table-dark">
<thead>
<tr name="mails-info">
<th data-field="state" data-checkbox="true"></th>
<th data-field="id">ID</th>
<th data-field="email">Email</th>
<th data-field="source">Source</th>
<th data-field="created_at">Created at</th>
<th data-field="modified_at">Modified at</th>
</tr>
</thead>
</table>
</div>
</div>
<script>
var $table = $('#table')
$(function() {
var data = {{data|safe}}
$table.bootstrapTable({data: data})
})
</script>
<button id="button2" class="btn btn-success" type="submit" style="margin-left: 2%">Save campaign</button>
</div>
<script>
var table = $('#table')
var button = $('#button2')
$(function() {
button.click(function () {
ids = []
for( i in table.bootstrapTable('getSelections')){
ids.push(table.bootstrapTable('getSelections')[i].id)
}
console.log(ids)
var form = $('#newCampaign')[0];
var formData = new FormData(form);
formData.append("IDs", ids);
$.ajax({
type: "POST",
enctype: 'multipart/form-data',
url: '',
data: formData,
processData: false,
contentType: false,
dataType: 'text/json',
success: function(){ alert("All ok") },
error: function() {
window.location.replace('..');
}
});
})
})
</script>
def addCampaignDataToDB(req):
mails_id = req
print(mails_id)
formCampaigns = CampaignsForm(req)
IDs = req['IDs']
if IDs != '':
IDs_list = IDs.split(',')
user_guid = req['user_guid'][0]
for i in IDs_list:
CampaignEmail.objects.create(email_guid=int(i), campaigne_guid=int(user_guid))
if formCampaigns.is_valid():
formCampaigns.save()
Есть ли какой-нибудь метод при вызове этого url:
?path('editCampaign/<int:pk>', views.CampaignEditor.as_view(), name='editCampaign')
, в дополнение к записанной форме, получить таблицу данных с чекбоксами, доступными для редактирования?
Заранее прошу прощения, если я не предоставил какую-то информацию или объяснил что-то непонятно
Вы не передаете никаких дополнительных данных в форму обновления. Представление обновления является отдельным и не наследует данные от представления добавления кампании, поэтому если вам нужен дополнительный контекст, вы можете:
class CampaignEditor(UpdateView):
model = Campaigns
template_name = 'mailsinfo/add_campaign.html'
form_class = CampaignsForm
def get_extra_context(self):
//call the super context from the parent class
context = super().get_context_data(*args, **kwargs)
data = list(Emails.objects.values()) #you may want to further filter for update purposes
data = MailsTableWithoutPass(data)
context['data'] = data
return context
Я не уверен, насколько большая часть формы создается javascript - возможно, стоит помнить, что шаблоны django делаются на стороне сервера, поэтому если вам нужно заполнить поля, которые создаются на стороне клиента с помощью JS, вам нужно поместить их значения куда-нибудь в виде JS-переменных, на которые вы сможете ссылаться позже, например,
<script>
{% for field in form %}
{{field.name}} = "{{field.value}}"
{% endfor %}
<script>