1

複数の pk 値にアクセスするときの django の URL とクラス ベースのビューの問題を示すテスト ケースを作成しました。

問題を示すファイルはaddressbook/family/templates/family/family_detail.html、私の試みの行をコメントアウトしました。

家族の詳細ページから特定の人にリンクしたいのですが、最初のコメントの試みはNoReverseMatch at /family/2/ . Reverse for 'person-detail' with arguments '(1,)' and keyword arguments '{}' not found. 1 pattern(s) tried: ['family/(?P<pk>\\d+)/person/(?P<pk>\\d+)/$']

2 番目と 3 番目のコメント付きの試みは、サーバー上で長時間スピンし、最終的にerror at /family/1/patient/1/ redefinition of group name 'pk' as group 2; was group 1

プロジェクトの構造は次のとおりです。

addressbook/
           addressbook/
                      urls.py
           family/
                 models.py
                 urls.py
                 views.py
                 templates/family/
                                  family_detail.html
                                  family_form.html
                                  family_list.html
           person/
                  models.py
                  urls.py
                  views.py
                  templates/person/
                                   person_detail.html
                                   person_form.html

addressbook/addressbook/urls.py

from django.conf.urls import patterns, include, url

urlpatterns = patterns('',
                       url(r'^family/',include('family.urls',namespace='family')),
)

addresbook/family/models.py

from django.db import models

class Family(models.Model):
    lastname=models.CharField(max_length=100)

    def __str__(self):
        return self.lastname

addressbook/family/urls.py

from django.conf.urls import include, patterns, url

from .views import FamilyCreateView, FamilyDetailView, FamilyListView

urlpatterns=patterns('',
                     url(r'^$',FamilyListView.as_view(),name='family-list'),
                     url(r'^create/$',FamilyCreateView.as_view(),name='family-create'),
                     url(r'^(?P<pk>\d+)/$',FamilyDetailView.as_view(),name='family-detail'),
                     url(r'^(?P<pk>\d+)/person/',include('person.urls',namespace='person')),
)

addressbook/family/views.py

from django.views import generic
from django.core.urlresolvers import reverse

from .models import Family

class FamilyListView(generic.ListView):
    context_object_name='family_list'
    model=Family


class FamilyDetailView(generic.DetailView):
    context_object_name='family'
    model=Family


class FamilyCreateView(generic.CreateView):
    model=Family

    def get_success_url(self,**kwargs):
        return reverse('family-detail',kwargs={'pk':self.object.pk})

addressbook/family/templates/family/family_detail.html

{% extends "base.html" %}
{% block content %}
<h1>{{ family }}</h1>
<ul>
  {% for person in family.person_set.all %}
    <li>{{ person }}</li>
    {#<li><a href="{% url 'family:person:person-detail' person.pk %}">{{ person }}</a></li>#}
    {#<li><a href="{% url 'family:person:person-detail' person.family.pk person.pk %}">{{ person }}</a></li>#}
    {#<li><a href="{% url 'family:person:person-detail' pk=person.family.pk pk=person.pk %}">{{ person }}</a></li>#}
  {% endfor %}
</ul>
<br><br><br>
<p><a href="{% url 'family:person:person-create' family.pk %}">Add family member</a></p>
<p><a href="{% url 'family:family-list' %}">Return to family list</a><p>
{% endblock content %}

addressbook/family/templates/family/family_form.html

{% extends "base.html" %}
{% block content %}
<h1>Add/Update Family</h1>
<form method="POST">{% csrf_token %}
{{ form }}
<p><button type="submit">Save</button></p>
</form>
<br><br><br>
<p><a href="{% url 'family:family-list' %}">Return to family list</a></p>
{% endblock content %}

addressbook/family/templates/family/family_list.html

{% extends "base.html" %}
{% block content %}
{% for family in family_list %}
<ul>
  <li><a href="{% url 'family:family-detail' family.id %}">{{ family }}</a></li>
</ul>
{% endfor %}
<br><br><br>
<a href="{% url 'family:family-create' %}">Create new family</a>
{% endblock content %}

addressbook/person/models.py

from django.db import models
from family.models import Family

class Person(models.Model):
    family=models.ForeignKey(Family)
    firstname=models.CharField(max_length=100)

    def __str__(self):
        return self.firstname

addressbook/person/urls.py

from django.conf.urls import patterns, url

from .views import PersonCreateView, PersonDetailView

urlpatterns=patterns('',
                     url(r'^create/$', PersonCreateView.as_view(),name='person-create'),
                     url(r'^(?P<pk>\d+)/$',PersonDetailView.as_view(),name='person-detail'),
)

addressbook/person/views.py

from django.views import generic
from django.core.urlresolvers import reverse
from django.shortcuts import get_object_or_404
from .models import Person
from family.models import Family

class PersonDetailView(generic.DetailView):
    model=Person


class PersonCreateView(generic.CreateView):
    model=Person

    def get_initial(self):
        family=get_object_or_404(Family,pk=self.kwargs.get('pk'))
        return {'family':family,}

    def get_success_url(self,**kwargs):
        return reverse('family:family-detail',args=[self.kwargs['pk']])
        #return reverse('person-detail',kwargs={'pk':self.object.pk})

addressbook/person/templates/person/person_detail.html:

{% extends "base.html" %}
{% block content %}
  {{ person }} {{ person.family }}
  <br><br>
<p><a href="{% url 'family:family-detail' person.family.pk %}">Return to family: {{ person.family }}</a></p>
{% endblock content %}

addressbook/person/templates/person/person_form.html

{% extends "base.html" %}
{% block content %}
<h1>Add/Update Person</h1>
<form method="POST">{% csrf_token %}
{{ form }}
<p><button type="submit">Save</button></p>
</form>
<br><br><br>
{#<p><a href="{% url 'family:family-detail' family.pk %}">Return to family {{ family }}</a></p>#}
{% endblock content %}
4

1 に答える 1

4

URL を再考する必要があります。以下のコメントがお役に立てば幸いです。

あなたが持っているあなたの家族のURLに

url(r'^(?P<pk>\d+)/person/',include('person.urls',namespace='person')),

次に、あなたが持っているあなたの人のURLに

url(r'^(?P<pk>\d+)/$',PersonDetailView.as_view(),name='person-detail'),

これは、フォームの URL を示唆してい/family/<pk>/person/<pk>/ます。同じパターンで名前付き引数 pk を 2 回使用したため、これは無効です。

URL パターンの主キーの 1 つの名前を変更すると、次のようになります。

url(r'^(?P<person_pk>\d+)/$',PersonDetailView.as_view(),name='person-detail'),

その後pk_url_kwarg、PersonDetail ビューでオプションを使用できます。

class PersonDetailView(generic.DetailView):
    model=Person
    pk_url_kwarg = 'person_pk'

また、上記の URL には 2 つの引数がありますが、テンプレートで URL を反転しようとすると、1 つの引数しか指定しないことに注意してください。あなたが持っている場所

<a href="{% url 'family:person:person-detail' person.pk %}">{{ person }}</a>

家族 pk と個人 pk を提供する必要があります。

<a href="{% url 'family:person:person-detail' family.pk person.pk %}">{{ person }}</a>
于 2013-09-03T23:24:43.730 に答える