django5-书籍与出版社关联外键
1.外键相关
一对多的概念 ,这里是一个出版社对应本书籍 ! 设计表使用model
models.ForeignKey('关联一', on_delete=models.CASCADE) #给多设置外键 ,关联一 ,设置级联删除当一的内容被删除 ,所关联的多都被删除
from django.db import models # Create your models here. class presslist(models.Model): name = models.CharField(max_length=32) def __str__(self): return self.name class Book(models.Model): name = models.CharField(max_length=32) p_id = models.ForeignKey('presslist', on_delete=models.CASCADE)
2.urls.py代码
两套增删改查
from django.conf.urls import url from app1 import views urlpatterns = [ url(r'^press/list/', views.presslist, name='presslist'), url(r'^press/del/(\d+)/', views.pressdel, name='pressdel'), url(r'^press/add/', views.pressadd, name='pressadd'), url(r'^press/edit/(?P<edit_id>\d+)/', views.pressedit1.as_view(), name='pressedit'), url(r'^book/list/', views.booklist, name='booklist'), url(r'^book/del/(\d+)/', views.bookdel, name='bookdel'), url(r'^book/add/', views.bookadd, name='bookadd'), url(r'^book/edit/(\d+)/', views.bookedit, name='bookedit'), ]
3.views视图函数
两套视图函数
重点的 :models.Book.objects.create(name=book_name, p_id_id=press_id) ,其中创建书籍记录需要关联出版社 ,这里面必须是从出版社表取数据p_id_id
from django.shortcuts import render, redirect, reverse, HttpResponse from django.views import View from app1 import models import time import functools from django.utils.decorators import method_decorator # Create your views here. def presslist(request): msg_all = models.presslist.objects.all() return render(request, 'cbs.html', {'msg': msg_all}) def pressadd(request): if request.method == 'POST': press_name = request.POST.get('name') models.presslist.objects.create(name=press_name) return redirect(reverse('presslist')) return render(request, 'cbsadd-edit.html') def pressdel(request, del_id): print(del_id, type(del_id)) models.presslist.objects.get(pk=del_id).delete() return redirect(reverse('presslist')) def pressedit(request, edit_id, test_id): obj = models.presslist.objects.get(pk=edit_id) print(test_id, edit_id) msg = '' if request.method == 'POST': obj.name = request.POST.get('name') if models.presslist.objects.filter(name=obj.name): msg = '已存在' if not obj.name: msg = '不能为空' if not models.presslist.objects.filter(name=obj.name) and obj.name: obj.save() return redirect(reverse('presslist')) return render(request, 'cbsadd-edit.html', {'obj': obj, 'msg': msg}) class pressedit1(View): def get(self, request, edit_id, msg=''): obj = models.presslist.objects.get(pk=edit_id) return render(request, 'cbsadd-edit.html', {'obj': obj, 'msg': msg}) def post(self, request, edit_id): msg = '' obj = models.presslist.objects.get(pk=edit_id) obj.name = request.POST.get('name') if models.presslist.objects.filter(name=obj.name): msg = '已存在' if not obj.name: msg = '不能为空' if not models.presslist.objects.filter(name=obj.name) and obj.name: obj.save() return redirect(reverse('presslist')) return self.get(request, edit_id, msg) def booklist(request): msg_all = models.Book.objects.all() return render(request, 'cbs.html', {'msg': msg_all}) def bookdel(request, del_id): models.Book.objects.get(pk=del_id).delete() return redirect(reverse('booklist')) def bookadd(request): msg_all = models.presslist.objects.all() if request.method == 'POST': book_name = request.POST.get('name') press_id = int(request.POST.get('pid')) models.Book.objects.create(name=book_name, p_id_id=press_id) return redirect(reverse('booklist')) return render(request, 'cbsadd-edit.html', {'msg_all': msg_all}) def bookedit(request, edit_id): obj = models.Book.objects.get(pk=edit_id) msg = '' if request.method == 'POST': obj.name = request.POST.get('name') if models.Book.objects.filter(name=obj.name): msg = '已存在' if not obj.name: msg = '不能为空' if not models.Book.objects.filter(name=obj.name) and obj.name: obj.save() return redirect(reverse('booklist')) return render(request, 'cbsadd-edit.html', {'obj': obj, 'msg': msg})
4.模板复用
cbs.html
###展示出版社 ,展示书籍列表的模板 {% extends 'base.html' %} {% block body1 %} <table class="text-center table table-striped table-bordered"> <tr> <td>ID</td> {% if msg.0.p_id %} <td>书名</td> <td>出版社名字</td> {% else %} <td>出版社名字</td> {% endif %} <td>操作</td> </tr> {% for obj in msg %} <tr> <td>{{ obj.pk }}</td> <td>{{ obj.name }}</td> {% if obj.p_id %} <td>{{ obj.p_id.name }}</td> <td><a href={% url 'bookedit' obj.pk %}><i class="fa fa-pencil-square-o" aria-hidden="true">   </i></a> <a href={% url 'bookdel' obj.pk %}><i class="fa fa-remove" aria-hidden="true"></i></a></td> {% else %} <td><a href={% url 'pressedit' edit_id=obj.pk %}><i class="fa fa-pencil-square-o" aria-hidden="true">   </i></a> <a href={% url 'pressdel' obj.pk %}><i class="fa fa-remove" aria-hidden="true"></i></a></td> {% endif %} </tr> {% endfor %} </table> {% endblock %}
cbsadd-edit.html
###修改与新增的复用模板 {% extends 'base.html' %} {% block body1 %} <form action="" method="post"> <div style="margin-left: 100px;margin-top: 50px;" class="col-md-6 "> <input type="text" class="form-control" name="name" placeholder="{{ obj.name }}">{{ msg }} {% if msg_all %} <select name="pid"> {% for obj in msg_all %} <option value="{{ obj.pk }}">{{ obj.name }}</option> {% endfor %} </select> {% endif %} </div> <div style="margin-left: 10px;margin-top: 50px;" class="col-md-2 "> <button type="submit" class="btn btn-primary">提交</button> </div> </form> {% endblock %}
脚踏实地,欲速不达