# 引入ListView
from django.views.generic import TemplateView, ListView, DeleteView
from django.core.urlresolvers import reverse_lazy
from django.views.generic.edit import CreateView
from django.shortcuts import redirect
import json
from django.http import HttpResponse
from .forms import CreateCourseForm
from .models import Course
from braces.views import LoginRequiredMixin
class AboutView(TemplateView):
    template_name = "course/about.html"
# 继承ListView
class CourseListView(ListView):
    # 被类所使用的数据模型,能够得到数据表中的所有记录
    model = Course
    # 传入模板的变量名称
    context_object_name = "courses"
    # 模板文件
    template_name = 'course/course_list.html'
class UserMixin:
    def get_queryset(self):
        qs = super(UserMixin, self).get_queryset()
        return qs.filter(user=self.request.user)
# 增加一个继承类LoginRequiredMixin,用于判断是否登录
class UserCourseMixin(UserMixin, LoginRequiredMixin):
    model = Course
    # 声明用户登录URL
    login_url = "/account/login/"
class ManageCourseListView(UserCourseMixin, ListView):
    context_object_name = "courses"
    template_name = 'course/manage/manage_course_list.html'
# 当用户以GET方式请求时,即在页面显示表单,CreateView就是完成这个作用的类
# 只要继承它,就不需要写get()方法了。
class CreateCourseView(UserCourseMixin, CreateView):
    # 声明在表单中显示的字段
    fields = ['title', 'overview']
    template_name = 'course/manage/create_course.html'
    def post(self, request, *args, **kargs):
        form = CreateCourseForm(data=request.POST)
        if form.is_valid():
            new_course = form.save(commit=False)
            new_course.user = self.request.user
            new_course.save()
            # 当表单内容被保存后,将页面转向指定位置
            return redirect("course:manage_course")
        # 当表单数据检测不通过时,让用户重新填写
        return self.render_to_response({"form":form})
# 继承了DeleteView类后,后续代码就不需要重复删除动作了
# 只需要声明确认删除模板template_name和删除完成之后的界面success_url
class DeleteCourseView(UserCourseMixin, DeleteView):
    template_name = 'course/manage/delete_course_confirm.html'
    success_url = reverse_lazy("course:manage_course")
    def dispatch(self, *args, **kwargs):
        resp = super(DeleteCourseView, self).dispatch(*args, **kwargs)
        # 如果是Ajax方法提交过来的数据,就直接反馈HttpResponse对象给前端
        if self.request.is_ajax():
            response_data = {"result": "ok"}
            return HttpResponse(json.dumps(response_data), content_type="application/json")
        else:
            return resp

三 重写前端模板

{% extends "article/base.html" %}
{% load staticfiles %}
{% block title %}管理课程{% endblock %}
{% block content %}
    <div class='text-right'><a href="{% url 'course:create_course' %}"><button type="button" class="btn btn-primary">添加课程</button></a></div>
    <table class="table table-hover" style="margin-top:10px">
            <td>序号</td>
            <td>课程标题</td>
            <td>发布日期</td>
            <td>操作</td>
        {% for course in courses %}
        <tr id={{ forloop.counter }}>
            <td>{{ forloop.counter }}</td>
            <td>{{ course.title }}</a></td>
            <td>{{ course.created|date:"Y-m-d" }}</td>
                <a name="edit" href="#"><span class="glyphicon glyphicon-pencil"></span></a>
                <a class="delete" nane="delete" href="{% url 'course:delete_course' course.id %}" ><span class="glyphicon glyphicon-trash" style="margin-left:20px;"></span></a>
                <a href="#"><span class="glyphicon glyphicon-search" style="margin-left:20px;"></span></a>
        {% endfor %}
    </table>
<script type="text/javascript" src='{% static "js/jquery.js" %}'></script>
<script type="text/javascript">
function getCookie(name) {
    var cookieValue = null;
    if (document.cookie && document.cookie != '') {
        var cookies = document.cookie.split(';');
        for (var i = 0; i < cookies.length; i++) {
            var cookie = jQuery.trim(cookies[i]);
            // Does this cookie string begin with the name we want?
            if (cookie.substring(0, name.length + 1) == (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
    return cookieValue;
$(document).ready(function() {
    var csrftoken = getCookie('csrftoken');
    function csrfSafeMethod(method) {
        return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
    $.ajaxSetup({
        crossDomain: false, // obviates need for sameOrigin test
        beforeSend: function(xhr, settings) {
            if (!csrfSafeMethod(settings.type)) {
                xhr.setRequestHeader("X-CSRFToken", csrftoken);
    var onDelete = function(){
        alert("确实要删除吗?");
        $.post(this.href, function(data) {
            // 前端得到反馈结果,就完成了删除和页面刷新
            if (data.result == "ok"){
              window.location.reload();
            } else {
                alert("出现了一些问题");
        }).fail(function() {
            alert("error");
        return false;
    $(".delete").click(onDelete);
</script>
{% endblock %}

四 测试效果

一 删除基本流程1 单击删除2 弹出确认框3 单击确认4 提交数据5 返回结果并跳转/刷新页面二 重写视图类# 引入ListViewfrom django.views.generic import TemplateView, ListView, DeleteViewfrom django.core.urlresolvers import reverse_lazy... views.py @method_decorator(login_required, name='dispatch') class ArticleDeleteView(DeleteView): model = Article success_url = reverse_lazy('blog:article_list') # def get_object(self, queryse # 继承了DeleteView类后,后续代码就不需要重复 删除 动作了 # 只需要声明确认 删除 模板template_name和 删除 完成之后的界面success_url class DeleteCourseView(UserCourseMixin, DeleteView): template_name = 'course/manage/delete_course_confir... 1.增加字段: is_delete = models.BooleanField(default=False, verbose_name='逻辑 删除 ', help_text='逻辑 删除 ') 2.重写models中delete 方法 : def delete(self, using=None, keep_parents=False):         ""...
Django 删除 数据 删除 实际上可以分为两种情况,一种是直接 删除 ,这样数据将会从物理存储设备上被 删除 ;另一种是“懒惰 删除 ”,只是将数据做了一个标记,表示其被 删除 。本文所述的是直接 删除 ,即“从数据库中将数据 删除 ”。 使用 model 的delete() 方法 from book.models import BookInfo BookInfo.objects.get(id=13).delete() model具备save() 方法 ,也具备delete() 方法 ,比较合理。 使用QuerySet的d
$conn = mysql_connect("localhost", "root", " ") or die("连接数据库服务器失败!".mysql_error()); //连接MySQL服务器 mysql_select_db("db_database27",$conn); //选择数据库db_database27
对于Python可视化中的 Django 驾驶舱的 实现 ,你可以考虑以下步骤: 1. 创建 Django 项目:首先,使用 Django 命令行工具创建一个新的 Django 项目。 2. 安装必要的库:在 Django 项目的虚拟环境中安装必要的库,如matplotlib、seaborn等用于数据可视化的库。 3. 准备数据:准备需要可视化的数据。可以从数据库中获取数据,或者从外部文件中读取数据。 4. 创建视图:在 Django 项目中创建一个视图函数,该函数将处理数据并生成可视化图表。 5. 使用数据可视化库:在视图函数中使用所选的数据可视化库创建图表。根据具体需求,可以选择使用matplotlib或seaborn等库来创建各种类型的图表,如柱状图、折线图、散点图等。 6. 设置模板:为了将可视化结果展示给用户,在 Django 项目中创建一个模板文件,并将生成的图表嵌入到模板中。 7. 创建URL路由:在 Django 项目的URL配置中添加一个路由,将用户请求与创建的视图函数关联起来。 8. 运行项目:运行 Django 项目,并访问包含可视化图表的页面。 通过按照上述步骤进行 操作 ,你可以在 Django 项目中 实现 一个可视化的驾驶舱。这样,用户就可以通过访问相应的URL来查看和交互式地探索数据可视化图表。希望这可以帮助到你!如果你有任何其他问题,请随时提问。