Ich habe mich schwer getan, eine Lösung zu finden, mit der ein angemeldeter Benutzer in django seine eigenen erstellten Modellobjekte löschen kann. Im Test auf Service-Objekten (ein Service-Auftrag, den sie mit einem ServiceForm (ModelForm) erstellen. Ich habe django-surfedelete verwendet, um die gelöschten Objekte in django admin zu erhalten, aber für den Benutzer verschwinden. Ich habe dieses Verhalten funktioniert, kann aber nicht wirklich löschen Die Objekte, versucht eine Menge von Permutationen mit 'ID' in der delete_service URL, pk = ID in der Ansicht, viele verschiedene Dinge, aber immer noch die gleiche Art von Fehler. (Wie unten auf der Service-Seite erwähnt, gibt es a Kontext, der die Daten des Modellobjekts in einem Panel zeigt, und in der unteren rechten Ecke des Panels eine Löschschaltfläche/modales Popup, die einen Kontext für die DeleteServiceForm -Funktion verwendet, um das Objekt zu löschen.Ich habe gehört, dass Sie mehr als einen Kontext pro Vorlage verwenden können nicht wie ist man dieses Problem zu umgehen?) Ich benutze python3.5, django1.11, postgresql db, apache2, auf ubuntu16.04 vm.Wie kann ich Benutzern erlauben, ihre Modellobjekte in django zu löschen?
'''
#ERROR
Exception Type: NoReverseMatch at /dashboard/service/
Exception Value: Reverse for 'delete_service' with keyword arguments '{'pk': ''}' not found. 1 pattern(s) tried: ['dashboard/deleteservice/(?P<pk>\\d+)/$']
'''
# dashboard/urls.py
url(r'^dashboard/deleteservice/(?P<pk>\d+)/$', views.delete_service, name='delete_service'),
url(r'^dashboard/service/$', views.service, name='service'),
# dashboard models.py
# django-safedelete model
from safedelete.config import *
from safedelete.models import SafeDeleteModel
from safedelete.managers import SafeDeleteManager
class MyModelManager(SafeDeleteManager):
_safedelete_visibility = DELETED_INVISIBLE
# service model
class Service(SafeDeleteModel):
_safedelete_policy = SOFT_DELETE_CASCADE
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
service_type = models.ManyToManyField('ServiceType')
description = models.TextField(blank=True)
def __str__(self):
return "Service Order for: {user}".format(user=self.user)
objects = MyModelManager()
class ServiceType(models.Model):
label = models.CharField(max_length=200, unique=True)
def __str__(self):
return self.label
# dashboard admin.py
class ServiceSDA(SafeDeleteAdmin):
list_display = (highlight_deleted, '__str__', 'created_at') + SafeDeleteAdmin.list_display
list_filter = ('user',) + SafeDeleteAdmin.list_filter
def has_delete_permission(self, request, obj=Service):
return True
admin.site.register(Service, ServiceSDA)
# dashboard forms.py
class NewServiceForm(forms.ModelForm):
accept_tos = forms.BooleanField(required=True)
class Meta:
model = Service
fields = '__all__'
exclude = ('user', 'created_at',)
widgets = {
'description': Textarea(attrs={'cols': 65, 'rows': 3, 'class':'stucco'}),
}
class DeleteServiceForm(forms.ModelForm):
class Meta:
model = Service
fields = []
# dashboard views.py
@login_required
def service(request):
service_list = Service.objects.all().filter(user=request.user).order_by('-created_at')
context = {'service_list': service_list}
return render(request, 'dashboard/service.html', context)
@login_required
def delete_service(request, pk):
# some code to check if this object belongs to the logged in user
if request.user.has_perm('dashboard.delete_Service'):
service_to_delete = get_object_or_404(Service, pk=pk)
if request.method == 'POST':
form = DeleteServiceForm(request.POST, instance=service_to_delete)
if form.is_valid(): # checks CSRF
service_to_delete.delete()
messages.warning(request, 'Success, your service order has been removed.')
return redirect('service')
else:
form = DeleteServiceForm(instance=service_to_delete)
return render(request, 'service', {'form': form, 'service_obj': service_to_delete})
else:
return http.Forbidden()
# dashboard/serviceblock.html - utilizes 2 contexts (1st is from service function, to show Service data in panel,
# 2nd is used in the modal popup, confirming deletion and using the DeleteServiceForm context 'service_obj': service_to_delete
'''
{% block services %}
{% for service in service_list %}
<div class="col-md-4">
<div class="panel panel-default text-left">
<div class="panel-header matrix">
<br>
<h4 class="panel-title text-center" style="color: lime;"> SLD Service Order </h4> <br>
</div>
<div class="panel-body">
<p>
Created On: <span class="pull-right text-success"> {{ service.created_at }} </span> <hr>
Service Type: <span class="pull-right text-success"> {% for type in service.service_type.all %} {{ type }} {% endfor %} </span> <hr>
Description: <span class="pull-right text-success"> {{ service.description }} </span>
</p>
</div>
<div class="panel-footer matrix">
<a href="#delservmodal" class="pull-right fa fa-times fa-2x" data-toggle="modal" aria-expanded="false" style="color: red;" title="Delete Service Order"></a> <br>
</div>
</div>
</div>
{% empty %}
<div class="col-md-4 col-md-offset-3">
<br><br> <h4 class="text-center">No service orders opened yet.</h4>
</div>
{% endfor %}
<!-- Start Modal -->
<div id="delservmodal" class="modal fade">
<div class="modal-dialog modal-sm" style="margin-top: 40vh;">
<div class="modal-content">
<div class="modal-body text-center">
<h5 class="text-danger"> Please confirm to delete service order </h5> <hr>
<form method="post" action="{% url 'delete_service' pk=service_obj.pk %}">
{% csrf_token %}
<button type="submit" class="btn btn-sm" data-dismiss="modal"> Delete </button> Delete
</form>
</div>
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
<!-- End Modal -->
{% endblock %}
'''