Как обновить только выбранные записи в Django queryset, как в действиях панели администратора?
Сразу прошу прощения за ошибки, английский не является моим родным языком (этот текст переведен гуглом)
Здравствуйте, я новичок в django и у меня есть вопрос. У меня есть таблица в DB с полями и булевым значением "checked". Нужно дать доступ к проверке записей другим пользователям, при этом я не хотел бы давать доступ к админ панели. Как я могу показать чекбокс в представлении вместе с кверисетом в таблице, чтобы установить значение true в таблице и обновить только строки, выбранные этим чекбоксом? Это должно работать как "Action" в админпанели django
P.S. Я пробовал через форму, но она только создает новую запись
p.p.s Теперь получается только обновить ВСЕ записи таблицы
Вот мой model.py
class moneIn(models.Model):
date = models.DateTimeField(auto_now_add=True, verbose_name='')
dateUpdate = models.DateTimeField(auto_now=True)
ts = models.IntegerField(verbose_name='')
pl = models.IntegerField(verbose_name='')
rem = models.IntegerField(verbose_name='')
comment = models.TextField(max_length=200, verbose_name='', blank=True)
staffer = models.ForeignKey(User, on_delete=models.PROTECT, verbose_name='')
checked = models.BooleanField(verbose_name='', default=False)
checkedUser = models.ForeignKey(User, on_delete=models.PROTECT, verbose_name='', blank=True, null=True, related_name='checkedUser')
def __str__(self):
return '{0}'.format(self.date)
# return self.user
class Meta:
ordering = ['-date']
verbose_name = ''
verbose_name_plural = ''
Необходимо изменить параметр "checked" через шаблон и автоматически вставить пользователя, отправившего запрос, в "checkedUser"
P.p.p.s Кроме того, я использую приложение Django filter для фильтрации
views.py
@login_required
# @user_passes_test(is_member_group)
def dashboard(request):
if request.user.groups.filter(name='DashBoardAccess').exists():
form = checkForm
f = tableDashFilter(request.GET, queryset=mIn.objects.all())
if request.method == 'POST':
form = checkForm(request.POST)
if form.is_valid():
data = form.cleaned_data
f.queryset.checked = data['checked']
f.queryset.update(**data)
return HttpResponse('ok')
else:
context = {
'filter': f,
'form': form
}
return render(request, 'dashboard/index.html', context)
else:
raise Http404()
HTML
<form action="" method="post">
{%csrf_token%}
<tbody class="table-view__body">
{% for out in filter.qs %}
<tr>
<td>{{form.checked}}</td>
<td>{{out.date|date:"d.m.Y"}}</td>
<td>{{out.ts}}</td>
<td>{{out.pl}}</td>
<td>{{out.rem}}</td>
<td>{{out.comment}}</td>
<td>{{out.checked}}</td>
<td>{{out.staffer}}</td>
<td>{{out.checkedUser}}</td>
{% endfor %}
</tbody>
</table>
<button type="submit">test</button>
</form>
Вам необходимо правильно отфильтровать набор запросов, к которому применяется .update()
.
Это:
f.queryset.update(**data)
Credit to: как отфильтровать набор запросов по отмеченным флажкам формы в django?