Django两表案例

django-admin startproject 项目名
python manage.py startapp 应用名

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'employee',
]

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR,'tem')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'HOST':'localhost',
        'POST':3306,
        'USER':'root',
        'PASSWORD':'123123',
        'NAME':'emp',
    }
}

LANGUAGE_CODE = 'zh-Hans'

TIME_ZONE = 'Asia/Shanghai'

在项目名对应的文件夹下的 init文件

import pymysql
pymysql.install_as_MySQLdb()

:注意主表和子表的先后顺序、注意外键的添加

from django.db import models

class Department(models.Model):
    dep_name = models.CharField(max_length=20,verbose_name='部门名称')
    desc = models.CharField(max_length=50,verbose_name='部门描述')

    class Meta:
        verbose_name = '部门表'
        verbose_name_plural = verbose_name
        db_table = 'department'
    def __str__(self):
        return self.dep_name

class Employee(models.Model):
    emp_name = models.CharField(max_length=20,verbose_name='姓名')
    job = models.CharField(max_length=20,verbose_name='职位')
    salary = models.IntegerField(default=3000,verbose_name='工资')
    department = models.ForeignKey(to=Department,on_delete=models.CASCADE,verbose_name='部门')
    class Meta:
        verbose_name = '员工表'
        verbose_name_plural = verbose_name
        db_table = 'employee'
    def __str__(self):
        return self.emp_name

在admin文件

from django.contrib import admin
from employee.models import Department,Employee

admin.site.register(Department)
admin.site.register(Employee)
python manage.py makemigrations

python manage.py migrate
python manage.py createsuperuser

在admin网址,自己添加信息

主路由

from django.contrib import admin
from django.urls import path,include
from employee import urls,views
urlpatterns = [
    path('admin/', admin.site.urls),
    path('',include(urls)),
]

子路由 在子应用文件夹下创建 urls py文件

from django.urls import path
from employee import views
urlpatterns = [
    path('dep/',views.DepView.as_view()),

    path('emp//',views.EmpView.as_view()),

    path('del//',views.DelView.as_view()),
    path('update//',views.UpdateEmpView.as_view()),
]
from django.shortcuts import render,redirect
from django.views import View
from django.http import HttpResponse
from employee.models import Department,Employee

class DepView(View):

    def get(self,request):

        departments = Department.objects.all()

        return render(request,'dep.html',{'deps':departments})

    def post(self,request):

        name = request.POST.get('name')
        job = request.POST.get('job')
        salary = request.POST.get('salary')
        dep = request.POST.get('dep')
        try:

            Employee.objects.create(
                emp_name=name,job=job,salary=salary,department_id=dep
            )
        except Employee as e:
            print(e)
            return HttpResponse('添加失败')

        return redirect('/dep/')
path('dep/',views.DepView.as_view()),

部门页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h3>部门页面</h3>
    <table width="400px" border="1px">
        <tr>
            <th>编号</th>
            <th>部门名称</th>
            <th>部门描述</th>
        </tr>
        {% for dep in deps %}
            <tr>
                <th>{{ dep.id }}</th>
                {
                <th><a href="/emp/{{ dep.id }}/">{{ dep.dep_name }}</a></th>
                <th>{{ dep.desc }}</th>
            </tr>
        {% endfor %}
    </table><br/>
    <form method="post">
        {% csrf_token %}
        姓名:<input type="text" name="name">
        职位:<input type="text" name="job">
        工资:<input type="text" name="salary">
        部门编号:<input type="text" name="dep">
        <input type="submit" value="添加">
    </form>
</body>
</html>
class EmpView(View):

    def get(self,request,id):

        emp_data = Employee.objects.filter(department_id=id)
        return render(request,'emp.html',{'emps':emp_data})

    path('emp//',views.EmpView.as_view()),

子表页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h3>员工信息</h3>
    <table width="500px" border="1px">
        <tr>
            <th>编号</th>
            <th>姓名</th>
            <th>职位</th>
            <th>工资</th>
            <th>部门</th>
            <th>操作</th>
        </tr>
        {% for emp in emps %}
            <tr>
                <th>{{ emp.id }}</th>
                <th>{{ emp.emp_name }}</th>
                <th>{{ emp.job }}</th>
                <th>{{ emp.salary }}</th>
                <th>{{ emp.department_id }}</th>
                <th>
                    <a href="/del/{{ emp.id }}/">删除</a>
                    <a href="/update/{{ emp.id }}/">更新</a>
                </th>
            </tr>
        {% endfor %}

    </table>
</body>
</html>
class DelView(View):
    def get(self,request,id):

        emp_data = Employee.objects.get(id=id)

        emp_id = emp_data.department_id

        emp_data.delete()

        return redirect(f'/emp/{emp_id}/')

    path('del//',views.DelView.as_view()),
class UpdateEmpView(View):

    def get(self,request,id):
        emp_data = Employee.objects.get(id=id)
        return render(request,'index.html',{'emp':emp_data})
    def post(self,request,id):
        name = request.POST.get('name')
        job = request.POST.get('job')
        salary = request.POST.get('salary')
        dep = request.POST.get('dep')
        try:
            emp_data = Employee.objects.get(id=id)
            emp_id = emp_data.department_id
            emp_data.emp_name=name
            emp_data.job=job
            emp_data.salary=salary
            emp_data.department_id=dep
            emp_data.save()
        except Employee as e:
            print(e)
            return HttpResponse('更新失败')
        return redirect(f'/emp/{emp_id}/')
path('update//',views.UpdateEmpView.as_view()),

更新页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h3>更新员工信息</h3>
     <form method="post">
        {% csrf_token %}
        姓名:<input type="text" name="name" value="{{ emp.emp_name }}">
        职位:<input type="text" name="job" value="{{ emp.job }}">
        工资:<input type="text" name="salary" value="{{ emp.salary }}">
        部门编号:<input type="text" name="dep" value="{{ emp.department_id }}">
        <input type="submit" value="修改">
    </form>
</body>
</html>

Original: https://blog.csdn.net/ZXY_lucky/article/details/124498694
Author: ZXY_lucky
Title: Django两表案例

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/733564/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球