练习 - 实现通用视图以编辑数据

已完成

为了允许用户在收容所注册新狗,我们将使用 CreateView

更新模型以支持 get_absolute_url

首先,更新模型以支持 get_absolute_url

  1. 在 Visual Studio Code 中,打开 dog_shelters/models.py。

  2. # TODO: Import reverse 行下方添加以下代码以导入 reverse 函数。

    # TODO: Import reverse
    from django.urls import reverse
    
  3. 在行读取 # TODO: Add get_absolute_url 后立即将以下代码添加到 Dog 类,以从 URLconf 读取 dog_detail 路径,并将 ID 作为参数传递。

        # TODO: Add get_absolute_url
        def get_absolute_url(self):
            return reverse('dog_detail', kwargs={"pk": self.pk})
    

重要

请记住,Python 使用选项卡而不是大括号 ({ }) 管理机箱。 因此,get_absolute_url 需要与 #TODO 注释处于同一选项卡级别。 可以参考解决方案目录中的文件来查看已完成的项目。

创建 DogCreateView

让我们创建 DogCreateView 来允许某人注册一只狗。

  1. 在 Visual Studio Code 中,打开 dog_shelters/views.py。

  2. 在 views.py 的末尾,添加以下代码以创建 DogCreateView

    class DogCreateView(generic.CreateView):
        model = models.Dog
        template_name = 'dog_form.html'
        fields = ['shelter', 'name', 'description']
    

我们将模型设置为 Dog,将模板设置为 dog_form.html,并设置要编辑的字段列表。

备注

列出字段的顺序将是它们在窗体中显示的顺序。

注册路由

创建视图后,让我们在 URLconf 中注册路由。

  1. 在 Visual Studio Code 中,打开 dog_shelters/urls.py。

  2. # TODO: Register create view 行下方,添加以下代码来注册路由。

    # TODO: Register create view
    path('dog/register', views.DogCreateView.as_view(), name='dog_register'),
    

创建 HTML 模板

让我们创建用于托管窗体的模板。

  1. 在 Visual Studio Code 中,在 dog_shelters/templates 内创建一个名为 dog_form.html 的新文件。

  2. 将以下代码添加到 dog_form.html 中,以创建用于托管窗体的模板。

    {% extends 'base.html' %}
    
    {# TODO: Register crispy_forms_tags #}
    
    {% block title %}
    Register dog at shelter
    {% endblock %}
    
    {% block content %}
    <h2>Register dog at shelter</h2>
    <form method="POST">
        {% csrf_token %}
    
        {{ form.as_p }}
    
        <button type="submit" class="btn btn-primary">Save</button>
    </form>
    {% endblock %}
    

备注

我们为自己添加了一个注释,以添加一个库,我们将在下一个练习中执行此操作。

让我们在收容所列表页(当前是应用程序的主页)上创建一个指向我们创建的注册页的链接。

  1. 在 Visual Studio Code 中,打开 dog_shelters/templates/shelter_list.html。

  2. {# TODO: Add link to registration page #} 行下方,添加以下代码以创建链接。

    {# TODO: Add link to registration page #}
    <div>
        <a href="{% url 'dog_register' %}">Register a dog available for adoption</a>
    </div>
    

测试页面

让我们看一下实际的页面。

  1. 选择“文件”>“全部保存”,以保存所有文件。

  2. 在浏览器中转到 http://localhost:8000

  3. 选择“注册一条可供领养的狗”。

    现在应能看到窗体。

    “注册狗”页的屏幕截图,其中突出显示了收容所的下拉列表。

    请注意外键关系是如何变成一个下拉列表的。

  4. 选择一个收容所,并为狗添加名称和描述。

  5. 选择“保存”。

    你现在已重定向到狗的详细信息页!

现在,你已经使用 CreateView 在 Django 中创建了一个创建窗体。