2017-09-12 6 views
1

J'ai un DeleteView que j'utilise pour supprimer des objets d'un modèle. Il est lancé via un bouton dans une table. Ça fonctionne bien.Comment inverser_lazy en une vue/url avec variable?

class DeleteAssignment(DeleteView): 
    model = Assignment 
    success_url = reverse_lazy('company') 

Screenshot

Je veux juste avoir revenir à sa vue parent en cas de succès. Je l'ai actuellement rediriger vers le parent parent (company), car cette vue ne nécessite pas de variable. Ce serait simple, mais la vue parent exige une farm_id variable pour rendre, cela est pris de l'URL comme «/ferme/18 »

url(r'^farm/(?P<farm_id>.+)', views.farm, name='farm'), 

J'ai résolu ce problème avec des formes sur la page en leur faisant redirigent à la vue farm avec la variable farm_id.

return redirect(farm, farm_id=farm_id) 

Comment pourrais-je faire avec le success_url pour mon DeleteView?

Exemple Nickie:

views.py

@login_required 
    def farm(request, farm_id=None): 
     user = request.user 
     company_id = user.profile.company_id 
     farm_id = farm_id 
     farm_filter = Farm.objects.filter(farm=farm_id) 
     farm_current = farm_filter[0] 
     # farm_company = 
     serial_filter = Sensor.objects.filter(assignment__farm__company_id__isnull=True) 
     assignment_filter = Assignment.objects.filter(farm=farm_id) 
     farm_instance = Farm.objects.get(farm=farm_filter[0].farm) 
     update_farm_form = UpdateFarmForm(instance=farm_instance) 
     assign_sensor_form = AssignmentForm() 

     if request.method == 'POST' and 'updatefarm' in request.POST: 
      update_farm_form = UpdateFarmForm(request.POST, instance=farm_instance) 
      if update_farm_form.is_valid(): 
       update_farm_form.save() 
       return redirect(farm, farm_id=farm_id) 
     else: 
      if request.method == "POST" and 'assignsensor' in request.POST: 
       assign_sensor_form = AssignmentForm(request.POST) 
       if assign_sensor_form.is_valid(): 
        assignment = assign_sensor_form.save() 
        if user.is_staff is True: 
         assignment.company_id = farm_filter[0].company_id 
        else: 
         assignment.company_id = user.profile.company_id 
        assignment.save() 
        return redirect(farm, farm_id=farm_id) 
       else: 
        assign_sensor_form = AssignmentForm(request.POST) 
     return render(request, 'users/farm_template.html', {'company_id': company_id, 'farm_filter': farm_filter, 'farm_current': farm_current, 'serial_filter': serial_filter, 'assignment_filter': assignment_filter, 'update_farm_form': update_farm_form, 'assign_sensor_form': assign_sensor_form}) 

urls.py

from django.conf.urls import url, include 
from django.contrib.auth import views as auth_views 

from apps.dashboard import views 
from apps.dashboard.views import DeleteAssignment, DeleteFarm 

urlpatterns = [ 
    url(r'^company/', views.company_view, name='company'), 
    # url(r'^test/', views.test), 
    # url(r'^test2/', views.test2, name='test2'), 
    # url(r'^farms/', views.add_farms), 
    url(r'^manual-signup/', views.signup_manual), 
    url(r'^signup/(?P<company_id>.+)', views.signup_company), 
    url(r'^settings/', views.update_profile), 
    url(r'^create-company/', views.create_company), 
    url(r'^create-sensor/', views.create_sensor), 
    url(r'^assign-sensor/', views.assign_sensor), 
    url(r'^login/$', auth_views.login, {'template_name': 'login.html'}, name='login'), 
    url(r'^logout/$', auth_views.logout, {'next_page': '/login'}, name='logout'), 
    url(r'^$', views.main), 
    # url(r'^company/(?P<company_id>.+)/farm/(?P<farm_id>.+)', views.farm), 
    url(r'^farm/(?P<farm_id>.+)', views.farm, name='farm'), 
    url(r'^unit/(?P<sensor_id>.+)', views.unit), 
    # url(r'^company/(?P<company_id>.+)', views.company), 
    url(r'^download/', views.download), 
    # url(r'^export/xls/$', views.export_users_xls), 
    url(r'^live/', views.live), 
    url(r'^data/', views.data), 
    url(r'^debug/', views.debug), 
    url(r'^delete-assignment/(?P<pk>\d+)/$', DeleteAssignment.as_view(), name='delete-assignment',), 
    url(r'^delete-farm/(?P<pk>\d+)/$', DeleteFarm.as_view(), name='delete-farm',), 
    url(r'^', include('django.contrib.auth.urls')) 
] 

C'est une vue réoriente se forme lors de la soumission de succès. Cela recharge les tables en fonction de la soumission de l'utilisateur sans avoir à traiter avec js pour le moment.

Le farm_id en return redirect(farm, farm_id=farm_id) est capturé à partir de l'URL, via la ligne appropriée dans urls.pyurl(r'^farm/(?P<farm_id>.+)', views.farm, name='farm'),

C'est tout ce que je veux faire le point de vue de suppression, au lieu de l'URL de succès étant simplement une vue , une vue avec une variable comme je l'ai fait ci-dessus.

+0

Je suppose que vous avez vu [ce] (https://docs.djangoproject.com/en/1.11/ref/class- based-views/mixins-editing/# django.views.generic.edit.DeletionMixin.success_url) et ce n'est pas suffisant pour vous. – nickie

+0

Vous devez ajouter ** urls.py ** pour que les utilisateurs comprennent exactement ce que vous voulez faire. –

+0

@nickie Cela a fonctionné parfaitement! Je ne sais pas comment j'ai raté ça. 'success_url ="/farm/{farm_id} "' – Jon

Répondre

2

Oui, vous pouvez le faire avec success_url ainsi:

class DeleteAssignment(DeleteView): 
    . . . . . 
    . . . . . 

    . . . . . 
    def get_success_url(self): 
      # if you are passing 'pk' from 'urls' to 'DeleteView' for company 
      # capture that 'pk' as companyid and pass it to 'reverse_lazy()' function 
      companyid=self.kwargs['pk'] 
      return reverse_lazy('company', kwargs={'pk': companyid}) 

Cela devrait fonctionner parfaitement.

Espérons que ça aide !!!!

+0

Puisque j'ajoute ceci ci-dessous, que devrais-je changer la ligne 'success_url = reverse_lazy ('company')'? – Jon

+0

remplacez dans le code ci-dessus 'return reverse_lazy ('company', kwargs = {'farm_id': farmid})' –

+0

Faites un essai. Cela devrait fonctionner correctement. –