如何在Django中将url中的pk参数传递给视图?

时间:2019-01-20 15:08:26

标签: python django

我在将pk从URL传递到视图中时遇到问题。当所有URL路径都位于同一文件中时,我曾进行过此工作,但是由于文件结构不良,我不得不重新组织事情。我不知道为什么这不再起作用。当我在视图中将PK硬编码并显示所有内容时,确实存在细节。这可能很简单,但确实会有所帮助。

URL-http://127.0.0.1:8000/club_home/1/

index.html

    <h2>Our Clubs</h2>
    {% for club in all_clubs %}
    <a href="{% url 'clubs:club_home_with_pk' pk=club.pk %}">
        <li>{{ club.club_name }}</li>
    </a>
  {% endfor %}

urls.py:

urlpatterns = [
url(r'^', views.club_home, name='club_home'),
url(r'^(?P<pk>\d+)/', views.club_home, name='club_home_with_pk'),
url(r'^edit/$', views.edit_club, name='edit_club'),

]

views.py:

def club_home(request, pk=None):
if pk:
    club = ClubInfo.objects.filter(pk=pk)
elif request.user.is_authenticated:
    club = ClubInfo.objects.filter(user=request.user)
# photo = model.club_logo.ImageField(storage=profile_pics)
args = {'club': club,
        }
return render(request, 'club_home_page.html', args)

club_home_page.html

     <h3>Club Details</h3>
<p>
    {% csrf_token %}
    {% for info in club %}
<li>{{ info.club_name }}</li>
<li><img src="{{ info.club_logo }}" height="50px" width="50px"/></li>
<li>{{ info.club_address1 }}</li>
<li>{{ info.club_address2 }}</li>
<li>{{ info.club_address3 }}</li>
<li>{{ info.club_town }}</li>
<li>{{ info.club_county }}</li>
<li>{{ info.club_country }}</li>
</p>

查看玩家注册:

class RegisterPlayer(APIView):
renderer_classes = [TemplateHTMLRenderer]
template_name = 'player_registration.html'

def get(self, request):
    serializer = PlayerRegistrationSerializer()
    return Response({'serializer': serializer,
                     })

def post(self, request):
    serializer = PlayerRegistrationSerializer(data=request.data)
    if serializer.is_valid():
        serializer.save()
        return Response(template_name='player_registration_complete.html')

1 个答案:

答案 0 :(得分:0)

问题出在您的网址格式中。具体来说,您的“ club_home”模式过于笼统。它匹配所有内容,包括提供PK的情况。

如果使用url()格式,则应始终终止模式:

urlpatterns = [
    url(r'^$', views.club_home, name='club_home'),
    url(r'^(?P<pk>\d+)/$', views.club_home, name='club_home_with_pk'),
    url(r'^edit/$', views.edit_club, name='edit_club'),
]

如果您使用的是Django的最新版本,则可以改用path

urlpatterns = [
    path('', views.club_home, name='club_home'),
    path('<int:pk>/', views.club_home, name='club_home_with_pk'),
    path('edit/', views.edit_club, name='edit_club'),
]