如何编写URL和视图

时间:2020-10-17 13:38:10

标签: django django-models django-forms django-views django-templates

下面是我的模特

class Movie(models.Model):
    name = models.CharField(max_length=55)
    artists = models.ManyToManyField(Artist)

    def __str__(self):
        return self.name

下面是视图:

def moviesView(request):
    movies = Movie.objects.all()
    context = {
        "movies": movies
    }
    return render(request, 'movies/movies.html', context=context)

def movieView(request, name):
    print(name)
    movie = Movie.object.get(name=name)
    context = {
        "movie": movie
    }
    return render(request, 'movies/movie.html', context=context)

以下是URL:

urlpatterns = [
    path('movies', moviesView, name='movies'),
    re_path('movies/(\d+)', movieView, name='movie'),
    path('artists', artistView, name='artists')
]

以下是模板:

<h1>Movies</h1>
    {% for movie in movies %}
        <a href="{% url 'movie' movie.name %}">{{ movie.name }}</a>
        <h3>{{ movie.name }}</h3>
        {% for artist in movie.artists.all %}
            <ul>
                <li><a href="{{ artist.wiki }}">{{ artist.name }}</a></li>
            </ul>
        {% endfor %}
    {% endfor %}

如果我单击电影复仇者,则该电影应带到另一页,其中包含模型中提到的复仇者的电影详细信息: 我需要将网址的框架设置为:http://127.0.0.1:8000/movies/avengers

1 个答案:

答案 0 :(得分:0)

您未指定参数。但是即使您这样做了,它也不会接受,因为\d+仅接受一个数字序列,而不是字符串。

您可以使用:

urlpatterns = [
    path('movies/', moviesView, name='movies'),
    path('movies/(?P<name>.*)/', movieView, name='movie'),
    path('artists/', artistView, name='artists')
]

,但是使用path可能更容易:

urlpatterns = [
    path('movies/', moviesView, name='movies'),
    re_path('movies/<str:name>/', movieView, name='movie'),
    path('artists/', artistView, name='artists')
]

使用名称也不是一个好主意。 percent encoded [wiki]中会包含许多字符,导致产生 ugly 网址。 Django使用slugs直观地生成令人愉悦的 URL。