1

Je veux obtenir un nom de projet pour Sample. Il devrait être dans self.args parce que mon urls.py ressemble à ça (il y a beaucoup de urls donc je signalerai que les importants):Django vide self.args dans ListView quand <pk> dans urls.py

projets/urls.py

app_name = 'projects' 
urlpatterns = [ 
    url(r"^$", ProjectListView.as_view(), name="projects_list"), 
    url(r"^(\w+)/robjects/", include("robjects.urls")), 
    url(r"^(\w+)/tags/$", TagsListView.as_view(), name="tag_list"), 
... 
] 

robjects/urls .py

app_name="robjects" 
urlpatterns = [ 
... 
    url(r'^(?P<pk>[0-9]+)/samples/', include("samples.urls")), 
] 

échantillons/urls.py

app_name="samples" 
urlpatterns = [ 
    url(r'^list/$', SampleListView.as_view(), name='sample_list_view'), 
    url(r'^create/$', SampleCreateView.as_view(), name='sample_create_view'), 
    url(r'^(?P<sample_id>[0-9]+)/update/$', SampleUpdateView.as_view(), name='sample_update'), 
    url(r'^(?P<sample_id>[0-9]+)/delete/$', SampleDeleteView.as_view(), name='sample_delete'), 
] 

Je veux project_name, qui est le '(\ w +)' une partie de proje cts/urls.py. Pour ce faire, j'ai écrit ce code dans samples/views.py. J'ai essayé de faire project_name = self.args [0] mais mes args sont vides.

classe SampleListView (ListView): modèle = échantillon template_name = "échantillons/samples_list.html"

def get(self, request, *args, **kwargs): 
     """A base view for displaying a list of objects.""" 
     # check if project exists 
     try: 
      pk = kwargs['pk'] 
      robject = Robject.objects.get(id=pk) 
      # add project to view attributes 
      self.robject = robject 
     except Robject.DoesNotExist: 
      raise Http404 
     print(self.args) # it should be a project name here 
     return super(SampleListView, self).get(request, *args, **kwargs) 

    def get_queryset(self, *args, **kwargs): 
     """ 
     Overwrite orginal qs and add filtering by robject 
     """ 

     # original queryset 
     qs = super().get_queryset(*args, **kwargs) 
     print('args, ',self.args) 
     print('kwargs', self.kwargs) 
     pk = self.kwargs['pk'] 
     robject = Robject.objects.get(id=pk) 
     return qs.filter(robject=self.robject) 

Ceci est la sortie:

args, () 
kwargs {'pk': '27'} 

Je veux filtrer mes qs par robject_id et par nom_projet, pour robject_id cela fonctionne bien. Je ne sais pas comment obtenir un nom de projet pour le filtrage.

De plus, je dois dire que dans Tags ("no includes in urls") je l'ai fait avec self.argss [0] et cela fonctionne, mais seulement sous forme de Tags ListView.

code ci-dessous:

class TagsListView(LoginRequiredMixin, ListView): 
    model = Tag 
    template_name = "tags/tag_list.html" 

    def get(self, request, *args, **kwargs): 
     """A base view for displaying a list of objects.""" 
     # check if project exists 
     try: 
      project = Project.objects.get(name=args[0]) # it works fine 
      # add project to view attributes 
      self.project = project 
     except Project.DoesNotExist: 
      raise Http404 
     return super(TagsListView, self).get(request,*args, **kwargs) 

Voici ce que j'ai découvert:

Quand je définis mon URL comme ça:

url(r"^(\w+)/robjects/samples/$", SampleListView.as_view(), name='sample_list_view'), 

Tous worrks. dans mes args est project_name et je peux l'attraper par self.args [0]

Mais quand j'ajoute que mes args sont vides,

url(r"^(\w+)/robjects/(?P<pk>[0-9]+)/samples/$", SampleListView.as_view(), name='sample_list_view'), 

Et quand je définis deux kwargs comme ceci:

url(r"^(?P<project_name>[\w\-]+)/robjects/(?P<pk>[0-9]+)/samples/list/$",SampleListView.as_view(), name='sample_list_view'), 

args vide - ce que je pensais, kwargs les deux sont OK et transmis à la vue

S'agit-il d'un bug Django ou est-il possible d'utiliser self.args? Sont-ils écrasés par kwargs?

Merci pour votre aide!

Répondre

0

Cela ressemble à un bug.Je l'ai testé et lorsque vous passez args et kwargs dans votre URL comme:

url(r"^(\w+)/test1/(?P<pk>[0-9]+)/test2/$", TestListView.as_view(), name='list_view'), 

alors le ListView retourne tuple vide pour args (il ne devrait pas). Cela fonctionne quand vous passez seulement des arguments ou seulement kwargs dans l'url.