from __future__ import absolute_import
from collections import OrderedDict
from django.core.exceptions import PermissionDenied, ObjectDoesNotExist
from django.core.paginator import InvalidPage, Paginator
from django.urls.base import NoReverseMatch
from django.db import models
from django.http import HttpResponseRedirect
from django.template.response import SimpleTemplateResponse, TemplateResponse
from django.utils import six
from django.utils.encoding import force_text, smart_text
from django.utils.html import escape, conditional_escape
from django.utils.safestring import mark_safe
from django.utils.text import capfirst
from django.utils.translation import ugettext as _
from xadmin.util import lookup_field, display_for_field, label_for_field, boolean_icon
from .base import ModelAdminView, filter_hook, inclusion_tag, csrf_protect_m
# List settings
ALL_VAR = 'all'
ORDER_VAR = 'o'
PAGE_VAR = 'p'
TO_FIELD_VAR = 't'
COL_LIST_VAR = '_cols'
ERROR_FLAG = 'e'
DOT = '.'
# Text to display within change-list table cells if the value is blank.
EMPTY_CHANGELIST_VALUE = _('Null')
class FakeMethodField(object):
"""
This class used when a column is an model function, wrap function as a fake field to display in select columns.
"""
def __init__(self, name, verbose_name):
# Initial comm field attrs
self.name = name
self.verbose_name = verbose_name
self.primary_key = False
class ResultRow(dict):
pass
class ResultItem(object):
def __init__(self, field_name, row):
self.classes = []
self.text = ' '
self.wraps = []
self.tag = 'td'
self.tag_attrs = []
self.allow_tags = False
self.btns = []
self.menus = []
self.is_display_link = False
self.row = row
self.field_name = field_name
self.field = None
self.attr = None
self.value = None
@property
def label(self):
text = mark_safe(
self.text) if self.allow_tags else conditional_escape(self.text)
if force_text(text) == '':
text = mark_safe(' ')
for wrap in self.wraps:
text = mark_safe(wrap % text)
return text
@property
def tagattrs(self):
return mark_safe(
'%s%s' % ((self.tag_attrs and ' '.join(self.tag_attrs) or ''),
(self.classes and (' class="%s"' % ' '.join(self.classes)) or '')))
class ResultHeader(ResultItem):
def __init__(self, field_name, row):
super(ResultHeader, self).__init__(field_name, row)
self.tag = 'th'
self.tag_attrs = ['scope="col"']
self.sortable = False
self.allow_tags = True
self.sorted = False
self.ascending = None
self.sort_priority = None
self.url_primary = None
self.url_remove = None
self.url_toggle = None
class ListAdminView(ModelAdminView):
"""
Display models objects view. this class has ordering and simple filter features.
"""
list_display = ('__str__',)
list_display_links = ()
list_display_links_details = False
list_select_related = None
list_per_page = 50
list_max_show_all = 200
list_exclude = ()
search_fields = ()
paginator_class = Paginator
ordering = None
# Change list templates
object_list_template = None
def init_request(self, *args, **kwargs):
if not self.has_view_permission():
raise PermissionDenied
request = self.request
request.session['LIST_QUERY'] = (self.model_info, self.request.META['QUERY_STRING'])
self.pk_attname = self.opts.pk.attname
self.lookup_opts = self.opts
self.list_display = self.get_list_display()
self.list_display_links = self.get_list_display_links()
# Get page number parameters from the query string.
try:
self.page_num = int(request.GET.get(PAGE_VAR, 0))
except ValueError:
self.page_num = 0
# Get params from request
self.show_all = ALL_VAR in request.GET
self.to_field = request.GET.get(TO_FIELD_VAR)
self.params = dict(request.GET.items())
if PAGE_VAR in self.params:
del self.params[PAGE_VAR]
if ERROR_FLAG in self.params:
del self.params[ERROR_FLAG]
@filter_hook
def get_list_display(self):
"""
Return a sequence containing the fields to be displayed on the list.
"""
self.base_list_display = (COL_LIST_VAR in self.request.GET and self.request.GET[COL_LIST_VAR] != "" and
self.request.GET[COL_LIST_VAR].split('.')) or self.list_display
return list(self.base_list_display)
@filter_hook
def get_list_display_links(self):
"""
Return a sequence containing the fields to be displayed as links
on the changelist. The list_display parameter is the list of fields
returned by get_list_display().
"""
if self.list_display_links or not self.list_display:
return self.list_display_links
else:
# Use only the first item in list_display as link
return list(self.list_display)[:1]
def make_result_list(self):
# Get search parameters from the query string.
self.list_queryset = self.get_list_queryset()
self.ordering_field_columns = self.get_ordering_field_columns()
self.paginator = self.get_paginator()
# Get the number of objects, with admin filters applied.
self.result_count = self.paginator.count
self.can_show_all = self.result_count <= self.list_max_show_all
self.multi_page = self.result_count > self.list_per_page
# Get the list of objects to display on this page.
if (self.show_all and self.can_show_all) or not self.multi_page:
self.result_list = self.list_queryset._clone()
else:
try:
self.result_list = self.paginator.page(
self.page_num + 1).object_list
except InvalidPage:
if ERROR_FLAG in self.request.GET.keys():
return SimpleTemplateResponse('xadmin/views/invalid_setup.html', {
'title': _('Database error'),
})
return HttpResponseRedirect(self.request.path + '?' + ERROR_FLAG + '=1')
self.has_more = self.result_count > (
self.list_per_page * self.page_num + len(self.result_list))
@filter_hook
def get_result_list(self):
return self.make_result_list()
@filter_hook
def post_result_list(self):
return self.make_result_list()
@filter_hook
def get_list_queryset(self):
"""
Get model queryset. The query has been filted and ordered.
"""
# First, get queryset from base class.
queryset = self.queryset()
# Use select_related() if one of the list_display options is a field
# with a relationship and the provided queryset doesn't already have
# select_related defined.
if not queryset.query.select_related:
if self.list_select_related:
queryset = queryset.select_related()
elif self.list_select_related is None:
related_fields = []
for field_name in self.list_display:
try:
field = self.opts.get_field(field_name)
except models.FieldDoesNotExist:
pass
else:
if isinstance(field.remote_field, models.ManyToOneRel):
related_fields.append(field_name)
if related_fields:
queryset = queryset.select_related(*related_fields)
else:
pass
# Then, set queryset ordering.
queryset = queryset.order_by(
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
毕业设计是高等教育阶段学生完成学业的一个重要环节,通常在学士或硕士学业即将结束时进行。这是学生将在整个学业中所学知识和技能应用到实际问题上的机会,旨在检验学生是否能够独立思考、解决问题,并展示其专业能力的一项综合性任务。 毕业设计的主要特点包括: 独立性: 毕业设计要求学生具备独立思考和解决问题的能力。学生需要选择一个合适的课题,研究相关文献,进行实地调查或实验,并提出独立见解。 实践性: 毕业设计是将理论知识应用到实际问题中的一次实践。通过完成毕业设计,学生能够将所学的专业知识转化为实际的解决方案,加深对专业领域的理解。 综合性: 毕业设计往往要求学生运用多个学科的知识,综合各种技能。这有助于培养学生的综合素养,提高他们的综合能力。 导师指导: 学生在毕业设计过程中通常由一名指导老师或导师团队提供指导和支持。导师负责引导学生确定研究方向、制定计划、提供建议,并在整个过程中监督进展。 学术规范: 毕业设计要求学生按照学术规范完成研究,包括文献综述、研究设计、数据采集与分析、结论和讨论等环节。学生需要撰写一篇完整的毕业论文,并进行答辩。
资源推荐
资源详情
资源评论
收起资源包目录
本科毕业设计-云学苑在线课程学习平台.zip (983个子文件)
config 335B
style.css 156KB
bootstrap.css 123KB
bootstrap.min.css 100KB
animate.css 72KB
aui.css 61KB
common-less.css 48KB
video-js.min.css 47KB
font-awesome.css 37KB
font-awesome.min.css 30KB
mobiscroll.css 26KB
common-less.css 22KB
mooc.css 20KB
bootstrap-theme.css 19KB
select2.css 19KB
bootstrap-theme.min.css 17KB
course-comment.css 16KB
selectize.bootstrap2.css 15KB
selectize.default.css 11KB
layer.css 11KB
selectize.legacy.css 11KB
selectize.bootstrap3.css 10KB
cityLayout.css 10KB
datepicker.css 10KB
learn-less.css 9KB
login.css 9KB
selectize.css 8KB
xadmin.main.css 8KB
laydate.css 6KB
lq.datetimepick.css 5KB
base.css 4KB
xadmin.responsive.css 4KB
bootstrap-modal.css 4KB
xadmin.form.css 4KB
bootstrap-clockpicker.css 4KB
laydate.css 3KB
bootstrap-image-gallery.css 3KB
bootstrap-clockpicker.min.css 3KB
layer.ext.css 3KB
reset.css 3KB
bootstrap-timepicker.css 3KB
bootstrap-image-gallery.min.css 2KB
bootstrap-timepicker.min.css 2KB
xadmin.widget.select-transfer.css 2KB
bootstrap-xadmin.css 2KB
xadmin.mobile.css 1KB
snap.css 1KB
xadmin.plugin.formset.css 1KB
xadmin.widget.editable.css 1KB
xadmin.page.dashboard.css 790B
xadmin.plugin.importexport.css 321B
xadmin.plugin.quickfilter.css 248B
xadmin.plugins.css 175B
xadmin.plugin.aggregation.css 95B
bootstrap-multiselect.css 0B
Thumbs.db 9KB
fontawesome-webfont.eot 162KB
glyphicons-halflings-regular.eot 20KB
background.gif 8KB
loading-0.gif 6KB
loading.gif 4KB
help_index_pic.gif 2KB
rolling.gif 2KB
select2-spinner.gif 2KB
loading-2.gif 2KB
ajax-loader.gif 2KB
select-arr-default.gif 1KB
pop-tips-info-arr.gif 1KB
loading-1.gif 701B
pixel.gif 43B
.gitignore 184B
usercenter-base.html 16KB
course-comment.html 10KB
org-list.html 10KB
org_base.html 9KB
course-detail.html 9KB
course-play.html 9KB
course-video.html 8KB
teacher-detail.html 8KB
base.html 7KB
index.html 7KB
course-list.html 6KB
forgetpwd.html 5KB
login.html 5KB
org-detail-homepage.html 5KB
model_list.html 5KB
teachers-list.html 5KB
register.html 4KB
usercenter-info.html 4KB
base_site.html 4KB
usercenter-fav-org.html 4KB
import.html 3KB
date.html 3KB
usercenter-fav-teacher.html 3KB
login.html 3KB
model_list.top_toolbar.exports.html 3KB
model_list.top_toolbar.importexport.export.html 3KB
usercenter-message.html 3KB
number.html 3KB
usercenter-fav-course.html 2KB
共 983 条
- 1
- 2
- 3
- 4
- 5
- 6
- 10
资源评论
JJJ69
- 粉丝: 6269
- 资源: 5775
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功