繁体   English   中英

如何将 pk 参数从 url 传递到 Django 的视图中?

[英]How to pass pk argument from url into view in Django?

我在将 pk 从 URL 传递到我的视图中时遇到问题。 当所有 URL 的路径都位于同一个文件中时,我之前有过这个工作,但由于文件结构不佳,我不得不重新组织。 我无法弄清楚为什么这不再起作用。 细节确实存在,因为我在视图中对 PK 进行了硬编码,并且显示了所有内容。 这可能很简单,但真的很感激一些帮助。

网址 - http://127.0.0.1:8000/club_home/1/

索引.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 %}

网址.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'),

]

视图.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')

问题在于您的 URL 模式。 具体来说,你的“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'),
]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM