Help me een aangepaste Django admin-actie implementeren voor batchverwerking van gegevens.
description
Door het implementeren van deze aangepaste admin-actie kan ik mijn workflows stroomlijnen, repetitieve taken verminderen en de algehele efficiëntie in het beheer van gegevens verbeteren.
prompt
try_prompt
Ik wil een aangepaste actie maken in de Django admin-interface waarmee ik meerdere records kan selecteren en een specifieke bewerking op hen kan uitvoeren. Beschrijf mijn huidige admin-con ... more
generate_helper
...
ai_answers
provider: openai
model: gpt-4.1-nano
Om een aangepaste actie in de Django admin-interface te maken waarmee je meerdere records kunt selecteren en een bewerking kunt uitvoeren, kun je de volgende stappen volgen:
1. Definieer een functie voor de actie, bijvoorbeeld het verwijderen van geselecteerde records.
2. Voeg deze actie toe aan de `actions`-lijst in je admin-klasse.
Hier is een voorbeeld van hoe je dit kunt implementeren voor je `Product` model:
```python
from django.contrib import admin
from .models import Product
def verwijder_geselecteerde_producten(modeladmin, request, queryset):
queryset.delete()
# Optioneel: bericht tonen
modeladmin.message_user(request, f"{queryset.count()} producten verwijderd.")
class ProductAdmin(admin.ModelAdmin):
list_display = ('titel', 'prijs', 'voorraad')
actions = [verwijder_geselecteerde_producten]
admin.site.register(Product, ProductAdmin)
```
Met deze configuratie kunnen beheerders meerdere producten selecteren en de actie "Geselecteerde producten verwijderen" uitvoeren. Wil je een andere bewerking toevoegen, zoals het bijwerken van een status of exporteren, dan maak je een vergelijkbare functie en voeg je die toe aan de `actions`-lijst.
provider: deepseek
model: deepseek-chat
Hier is hoe je een aangepaste bulk-actie kunt maken in de Django admin om geselecteerde producten te verwijderen:
## Stap 1: Maak de aangepaste admin actie
Voeg dit toe aan je `admin.py` bestand:
```python
from django.contrib import admin
from django.http import HttpResponseRedirect
from django.contrib import messages
from .models import Product
def delete_selected_products(modeladmin, request, queryset):
"""
Aangepaste actie om geselecteerde producten te verwijderen
"""
try:
count = queryset.count()
queryset.delete()
messages.success(request, f'{count} product(en) succesvol verwijderd.')
except Exception as e:
messages.error(request, f'Fout bij verwijderen: {str(e)}')
delete_selected_products.short_description = "Geselecteerde producten verwijderen"
@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
list_display = ['titel', 'prijs', 'voorraad']
list_filter = ['voorraad']
search_fields = ['titel']
# Voeg de aangepaste actie toe
actions = [delete_selected_products]
```
## Stap 2: Alternatieve geavanceerde versie (met bevestiging)
Voor een veiligere implementatie met bevestiging:
```python
def delete_selected_with_confirmation(modeladmin, request, queryset):
"""
Verwijder geselecteerde producten met bevestiging
"""
if request.POST.get('post'):
# Daadwerkelijke verwijdering
count = queryset.count()
queryset.delete()
messages.success(request, f'{count} product(en) succesvol verwijderd.')
return None
else:
# Toon bevestigingspagina
from django.contrib.admin.helpers import ActionForm
from django import forms
from django.template.response import TemplateResponse
class ConfirmDeleteForm(ActionForm):
confirm = forms.BooleanField(
required=True,
label="Bevestig verwijdering",
help_text="Weet u zeker dat u deze producten wilt verwijderen?"
)
context = {
'title': 'Bevestig verwijdering',
'queryset': queryset,
'action_checkbox_name': admin.helpers.ACTION_CHECKBOX_NAME,
'form': ConfirmDeleteForm(),
'opts': modeladmin.model._meta,
}
return TemplateResponse(request, 'admin/confirm_bulk_delete.html', context)
delete_selected_with_confirmation.short_description = "Verwijder geselecteerde producten (met bevestiging)"
```
## Stap 3: Maak template voor bevestiging (optioneel)
Maak een template `templates/admin/confirm_bulk_delete.html`:
```html
{% extends "admin/base_site.html" %}
{% block content %}
<h1>Bevestig bulk verwijdering</h1>
<p>U staat op het punt om de volgende {{ queryset.count }} product(en) te verwijderen:</p>
<ul>
{% for product in queryset %}
<li>{{ product.titel }} - €{{ product.prijs }}</li>
{% endfor %}
</ul>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="hidden" name="post" value="yes">
<input type="submit" value="Verwijderen bevestigen" class="default">
<a href="../" class="button cancel-link">Annuleren</a>
</form>
{% endblock %}
```
## Gebruik in de admin:
1. Ga naar de productenlijst in de admin
2. Selecteer de gewenste producten met de checkboxes
3. Kies "Geselecteerde producten verwijderen" uit de actie-dropdown
4. Klik op "Uitvoeren"
## Belangrijke opmerkingen:
- De standaard Django admin heeft al een "Verwijder geselecteerde [objecten]" actie
- Deze aangepaste versie geeft je meer controle over het proces
- Je kunt de actie aanpassen voor andere bulk-operaties (prijzen bijwerken, voorraad aanpassen, etc.)
- Zorg voor goede foutafhandeling bij productiegebruik
Wil je dat ik andere bulk-acties toevoeg, zoals voorraad bijwerken of prijzen aanpassen?

