Python日记| #十五。结合django和反应
#spanish #python #django #开发日志

Code comments be like

今天,当他在山顶上大喊“边界”时,Echo回到我身上“ React”或“ Angular”。我决定选择第一个(剧情曲折,是在艺术标题中);并开始从头开始学习。

YaSabãaJavaScript

我必须澄清此细节,因为许多阅读我的文章的人现在正在进入系统世界。请记住,我已经有14年的时间了,这给了我足够的时间旅行一些小语言。

JavaScript和TypeScript是使用React的卓越编程语言,第二个是(我认为)推荐的更多。

这使我能够显着减少React中的学习曲线。如果JS编程了,我告诉您,了解Asynchrona并承诺在这本小册子中占很重要。

React是一本小册子,而不是框架

他们会在许多课程中听这句话,但是很少有人需要正确的时间来解释它:与Angular(一个复杂的框架)不同,React是一本附上我们项目的小册子。

这意味着它的结构是我们的责任:在一个框架中,我们已经有了指南和规则,以避免不良实际。但是,只要我们负责将其包括在项目的生态系统中,图书馆就不仅仅是一组促进生活的功能。

React将使您能够重复使用组件,并伴随着生命周期和层次结构。这很棒,并为您提供了必须在项目中控制的自由,以获得最大的潜力。

我们开始做吧

ybeing un tutorial de Fazt,Armâ©a todolist,他使用了如此多的反应,如djago(y Dr.)。

首先组装一个包括我的“任务”应用程序的项目,其中包括以下模型:

from django.db import models


class Task(models.Model):
    title = models.CharField(max_length=200)
    description = models.TextField(blank=True)
    done = models.BooleanField(default=False)

    def __str__(self) -> str:
        return self.title

然后为此模型编写序列化器:

from rest_framework import serializers
from .models import Task


class TaskSerializer(serializers.ModelSerializer):
    class Meta:
        model = Task
        fields = '__all__'

现在在views.py上,放置视图:

from rest_framework import viewsets
from .serializers import TaskSerializer
from .models import Task


class TaskView(viewsets.ModelViewSet):
    serializer_class = TaskSerializer
    queryset = Task.objects.all()

modelViewSet 为我提供了所有最多的典型crud:get,post,put,put,patch,delete。现在我只需要映射网址:

from django.urls import path, include
from .views import TaskView
from rest_framework import routers
from rest_framework.documentation import include_docs_urls

router = routers.DefaultRouter()
router.register(f'tasks', TaskView, 'tasks')

urlpatterns = [
    path('api/v1/', include(router.urls)),
    path('docs/', include_docs_urls(title="Tasks API")),
]

一方面,组装对象路由器,这将帮助我映射我的视图集的世界。然后还包括 include_docs_urls ,它生成了非常功能的API文档样式。

我还必须为CORS添加一个方向,这是我的应用程序中我应用的来源:

CORS_ALLOWED_ORIGINS = [
    'http://127.0.0.1:5173'
]

是反应时间!

随着API的运行,只剩下边框。 React和Django之间没有这样的组合,但是我可以在项目中构建一个 client 文件夹,尽管该文件夹是分开的,但可以满足其与API进行交互的功能。

此时,他采取了除了实施FAZT以外的几个快捷方式,因此我决定构建完整的API文件:

import axios from 'axios'

const taskApi = axios.create({
    baseURL: 'http://localhost:8000/tasks/api/v1/tasks/'
})

export const getAllTasks = () => taskApi.get('/')

export const getTask = (id) => taskApi.get(`/${id}/`)

export const createTask = (task) => taskApi.post('/', task)

export const deleteTask = (id) => taskApi.delete(`/${id}`)

export const updateTask = (id, task) => taskApi.put(`/${id}/`, task)

林戈

原则上定义了 browserrouter ,它导致使用某些组件的不同页面

function App() {
  return (
    <BrowserRouter>
      <div className="container mx-auto">
        <Navigation />
        <Routes>
          <Route path="/" element={<Navigate to="/tasks" />} />
          <Route path="/tasks" element={<TasksPage />} />
          <Route path="/tasks-create" element={<TaskFormPage />} />
          <Route path="/tasks/:id" element={<TaskFormPage />} />
        </Routes>
      </div>
      <Toaster />
    </BrowserRouter>
  );
}

他们会看到一个罕见的CSS课程,这是因为我正在使用Tailwind进行样式。

在当前顺序中,路线为:

  • /:重定向A/任务。
  • /任务:显示现有任务的列表
  • /tasks-reate:创建新任务的表格
  • /task/ð带有加载任务的表格。

这最后的路由既用于编辑任务并消除任务。

显示任务的流程

我们知道,为了显示可视化所有任务的página,我们使用任务page组件:

<Route path="/tasks" element={<TasksPage />} />

是组件rhetora tasklist:

export function TaskList() {
    const [tasks, setTasks] = useState([])

    useEffect(() => {
        async function loadTasks() {
            const res = await getAllTasks()
            setTasks(res.data)
        }

        loadTasks()
    }, [])

    return <div className="grid grid-cols-3 gap-3">
        {tasks.map(task => (
            <TaskCard key={task.id} task={task} />
        ))}
    </div>
}

通过使用效率,该效率将在创建组件后立即执行,我们调用 getallTask​​s()(django api)异步,然后通过 tasks显示每个任务。地图< /em>,它将在TaskCard中渲染此类信息。< /p>

通过这种方式,我们实现了干净和流畅的通信,因为我们的API像其他任何人一样工作,并且根据需要它们的组件而将其最佳称为它们。

结论

我已经走了季节(我继续从椅子上站起来),这是两个世界的神圣联盟(我举起胳膊,看听众)。

我希望您喜欢我写这篇文章,并在下一篇文章中见到您!