2017-06-09 2 views
0

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;"> &nbsp; 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 %} 

''' 

Antwort

0

Nach viel Mühe aufgegeben, eine benutzerdefinierte Ansicht schreiben, die nicht funktioniert, für die generische DeleteView. beste Antwort, die ich fand, war hier Python Django delete current object

Verwandte Themen