2016-09-18 5 views
1

私はフラッシュカードを含む学習アプリを作っています。ユーザーは主題を作ってカードを含むデッキを置くことができます。例えば、生物学の科目では、「ユニット1」と呼ばれるデッキがあり、デッキにはカードがいっぱいです。デッキのためのURLは、理想的にはここでDjango:idsの代わりに名前付きURLでのトラブル

localhost:8000/subjects/Biology/unit-one/ 

のようになります。私のコード

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 
    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) 

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 

urls.py

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

index.htmlを

<li><a href="{% url 'card:subject' subject.subject_name %}"> 

subject.html

<ul> 
    {% for deck in subject.deck_set.all %} 
    <li><a href="{% url 'card:deck' deck.deck_name %}">{{deck.deck_name}}</a></li> 
    {% endfor %} 
</ul> 

しかし、私はこのエラーを取得しています。

Generic detail view SubjectView must be called with either an object pk or a slug. 

インデックスページが正しく表示されていますが、件名をクリックするとそのエラーが発生します。これをどうやって解決するのですか?

答えて

0

SubjectView.slug_url_kwargを試しましたか?

+0

番に変更Charで試してみてください? – user298519

+0

'slug_field'は識別子としてフィールドを配線し、' slug_url_kwarg'はurlパラメータをそのフィールドに結び付けます。だから私はそれもあなたのURLパラメータだから、 "件名"に設定すると思います。 – pnovotnak

+0

も持っています。 オブジェクトの_nameフィールドは冗長です。 .name – pnovotnak

1

ただ前提です。私のようにそれを設定します何もSlug

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

slug_field = "subject_name" 
+0

に短縮することもできます。 – pnovotnak

関連する問題