python - 关于 Django 在 urlpattern 中的 pk

标签 python django url

我是 Django 新手,我正在 github 上阅读一个应用程序:

https://github.com/rogargon/myrecommendations/blob/web2-html/myrestaurants/urls.py#L18

有一个像

这样的 urlpattern
url(r'^restaurants/(?P<pk>\d+)/$',
        RestaurantDetail.as_view(),
        name='restaurant_detail')

它撤销 RestaurantDetail View ,此处:https://github.com/rogargon/myrecommendations/blob/master/myrestaurants/views.py#L36

class RestaurantDetail(DetailView):
    model = Restaurant
    template_name = 'myrestaurants/restaurant_detail.html'

    def get_context_data(self, **kwargs):
        context = super(RestaurantDetail, self).get_context_data(**kwargs)
        context['RATING_CHOICES'] = RestaurantReview.RATING_CHOICES
        return context

这里我知道pk被设置为一个数字,表示餐厅的ID,但在html模型中,https://github.com/rogargon/myrecommendations/blob/master/myrestaurants/templates/myrestaurants/restaurant_detail.html ,我没有看到任何地方使用pk,但是页面只显示了一家餐厅。您能知道这个过程中pk是如何工作的吗?模板如何知道我想展示哪家餐厅?为什么这个 View 没有返回?

 {% extends "myrestaurants/base.html" %}
{% block title %}MyRestaurants - {{ restaurant.name }}{% endblock %}
{% block content %}

<span vocab="http://schema.org/" typeof="Restaurant">

<h1>
    <span property="name">{{ restaurant.name }}</span>
    {% if user == restaurant.user %}
        (<a href="{% url 'myrestaurants:restaurant_edit' restaurant.id %}">edit</a>)
    {% endif %}
</h1>

<h2>Address:</h2>
<p>
    {{ restaurant.street }}, {{ restaurant.number }} <br/>
    {{ restaurant.zipcode }} {{ restaurant.city }} <br/>
    {{ restaurant.stateOrProvince }} ({{ restaurant.country }})
</p>

<h2>
    Dishes
    {% if user.is_authenticated %}
        (<a href="{% url 'myrestaurants:dish_create' restaurant.id %}">add</a>)
    {% endif %}
</h2>
<ul>
    {% for dish in restaurant.dishes.all %}
        <li><a href="{% url 'myrestaurants:dish_detail' restaurant.id dish.id %}">
            {{ dish.name }}</a></li>
    {% empty %}<li>Sorry, no dishes for this restaurant yet.</li>
    {% endfor %}
</ul>

<h2>Reviews</h2>
{% if restaurant.restaurantreview_set.all|length > 0 %}
<span rel="aggregateRating">
    <p typeof="AggregateRating">
        Average rating <span property="ratingValue">{{ restaurant.averageRating|stringformat:".1f" }}</span>
        {% with restaurant.restaurantreview_set.all|length as reviewCount %}
        from <span property="reviewCount">{{ reviewCount }}</span> review{{ reviewCount|pluralize }}
        {% endwith %}
    </p>
</span>
<ul rel="review">
    {% for review in restaurant.restaurantreview_set.all %}
        <li typeof="Review">
            <p rel="reviewRating" typeof="Rating">
                <span property="worstRating" content="{{ RATING_CHOICES.0.0 }}"></span>
                <span property="ratingValue">{{ review.rating }}</span> star{{ review.rating|pluralize }}
                {% with RATING_CHOICES|last as best %}
                <span property="bestRating" content="{{ best.0 }}"></span>
                {% endwith %}
            </p>
            <p property="description">{% if review.comment %}{{ review.comment }}{% endif %}</p>
            <p>Created by <span property="author">{{ review.user }}</span> on
                <span property="datePublished" content="{{ review.date|date:'Y-m-d' }}">{{ review.date }}</span></p>
        </li>
    {% endfor %}
</ul>
{% endif %}

</span>

<h3>Add Review</h3>
<form action="{% url 'myrestaurants:review_create' restaurant.id %}" method="post">
    {% csrf_token %}
    Message: <textarea name="comment" id="comment" rows="4"></textarea>
    <p>Rating:</p>
    <p>{% for rate in RATING_CHOICES %}
    <input type="radio" name="rating" id="rating{{ forloop.counter }}" value="{{ rate.0 }}" />
    <label for="choice{{ forloop.counter }}">{{ rate.1 }} star{{ rate.0|pluralize }}</label>
    <br/>{% endfor %}
    </p>
    <input type="submit" value="Review" />
</form>

{% endblock %}
{% block footer %}
    Created by {{ restaurant.user }} on {{ restaurant.date }}
{% endblock %}

最佳答案

您询问的行为(“模板如何知道我想显示哪家餐厅”)是 View 行为,而不是模板行为。

模板渲染器通过 View 传递一个restaurant值。该 View 没有(显式)返回,因为它是 class-based view - 特别是 DetailView 的子类。 DetailView 本身继承了此 View 不会重写的标准方法来接受 PK 参数并加载特定实例。

如果您愿意,您可以阅读 DetailView 的源代码,以更多地了解正在发生的情况,例如 https://github.com/django/django/blob/master/django/views/generic/detail.py - 但是基于类的 View 是一个有点高级的主题,并不是每个项目都会使用它们。我会首先关注其他领域。

关于python - 关于 Django 在 urlpattern 中的 pk,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48055255/

相关文章:

java - 检查 WebView 中的 URL 更改

javascript - 如何使用 jQuery 从 URL 获取端口号?

java - 无论如何从 URL 中删除参数

python - 如何通过Python API获取OpenStack中VM实例的运行时间?

python - 根据特定列值将数据集拆分为两组行 [python,unix]

python - Genshin中nl2br的方法是什么?

android - 在开发和生产中使用不同的 firebase 服务帐户

python - Django 管理中的 ManyToMany : select none

python - chaquopy 中的语言检查工具

python - 如果在数据库中找不到查询集,如何退出 View 功能