2017-06-09 13 views
0

djangoにログインしたユーザーが自分で作成したモデルオブジェクトを削除できるようにするための解決策が出てきました。サービスオブジェクト(ServiceForm(ModelForm)で作成したサービスオーダー)django-safedeleteを使用して、削除されたオブジェクトをdjango管理者に保存しますが、ユーザーには表示されません。オブジェクトは、delete_serviceのURLに 'id'を入れて多くの順列を試しました.pk = idというビューでは、さまざまなことが起こりましたが、同じタイプのエラーが発生しました(下記のように、サービスページにはモデルのオブジェクトのデータをパネルに表示するコンテキストと、パネルの右下にDeleteServiceForm関数のコンテキストを使用してオブジェクトを削除する削除ボタン/モーダルポップアップです。テンプレートごとに複数のコンテキストを使用することはできませんが、この問題を回避する方法はありませんか?)私は、ubuntu16.04 vmのpython3.5、django1.11、postgresql db、apache2を使用しています。ユーザーはdjangoでモデルオブジェクトを削除することができますか?

''' 
#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 %} 

''' 

答えて

0

多くの苦労の末、Generic DeleteViewのために動作しないカスタムビューを作成することを放棄しました。私が見つけた最高の答えはここでしたPython Django delete current object

関連する問題