2016-09-13 64 views
0

我正在制作一个涉及抽认卡的学习应用程序。它分为主题。每个科目(生物学,物理学)都有一套套牌(unitone,unittwo)。每套牌都有一套牌(术语和定义)。我希望我的URL看起来像 localhost:8000/biology/unitone /但我无法将两个URL参数放在一个URL中。Django:多个网址参数

models.py

class Subject(models.Model): 
    subject_name = models.CharField(max_length=100) 
    description = models.TextField() 

    def __str__(self): 
     return self.subject_name 

    def get_absolute_url(self): 
     return reverse('card:index') 

class Deck(models.Model): 
    deck_name = models.CharField(max_length=100) 
    subject = models.ForeignKey(Subject, on_delete=models.CASCADE) 

    def __str__(self): 
     return self.deck_name 

class Card(models.Model): 
    term = models.CharField(max_length=100) 
    definition = models.TextField() 
    deck = models.ForeignKey(Deck, on_delete=models.CASCADE) 

    def __str__(self): 
     return self.term 

views.py

class IndexView(generic.ListView): 
    template_name = 'card/index.html' 
    context_object_name = 'subjects' 

    def get_queryset(self): 
     return Subject.objects.all() 

class SubjectView(DetailView): 
    model = Subject 
    slug_field = "subject" 
    template_name = 'card/subject.html' 

class DeckView(DetailView): 
    model = Deck 
    slug_field = "deck" 
    template_name = 'card/deck.html' 

urls.py

# localhost:8000/subjects/1 (biology) 
url(r'^subjects/(?P<pk>[0-9]+)/$', views.SubjectView.as_view(), name='subject') 


# localhost:8000/subjects/1/1 (biology/unitone) 
url(r'^subjects/(?P<pk>[0-9]+)/(?P<pk>[0-9]+)/$', views.DeckView.as_view(), name='deck'), 

在urls.py第二URL是我有什么麻烦。这不是有效的网址。

+0

那你试试,哪部分没没有按预期工作? – knbk

+0

编辑我的帖子! – user298519

+0

您定义了“pk”两次,这可能是问题 – karlosss

回答

2

不能有多个具有相同名称的参数。你必须给每个参数的唯一名称,例如:

url(r'^subjects/(?P<pk>[0-9]+)/(?P<deck>[0-9]+)/$', views.DeckView.as_view(), name='deck'), 

DeckView你就可以访问它们作为self.kwargs['pk']self.kwargs['deck']

+0

我将如何在模板中访问它们? deck.id不工作 – user298519

+0

它应该是'url(r'^ subjects /(?P [0-9] +)/(?P [0-9] +)/ $',views.DeckView。 as_view(),name ='deck')',因为'DetailView'通过pk键获取对象,所以当有人调用'subject/2/3'时,它会返回pk 2对象而不是pk 3 – arcegk

1

有一种方法,通过重写DetailViews

urls.py

url(r'^subjects/(?P<subjects>\w+)/(?P<deck>\w+)/$', views.DeckView.as_view(), name='deck'), 

views.py

class DeckView(DetailView): 
    model = Deck 
    # slug_field = "deck" # you don't need it 
    template_name = 'card/deck.html' 


    def get_object(self, subjects, deck): 
     subject_obj = Subject.objects.filter(subject_name=subjects).first() 
     obj = Deck.objects.filter(subject=subject_obj,deck_name=deck).first() 
     return obj 


    def get(self, request, subjects, deck): 
     self.object = self.get_object(subjects, deck) 
     context = self.get_context_data(object=self.object) 
     return self.render_to_response(context) 

然后访问localhost:8000/subjects/biology/unitone/