diff --git a/blog/admin.py b/blog/admin.py index d1f148e..e7ef6bf 100644 --- a/blog/admin.py +++ b/blog/admin.py @@ -4,18 +4,18 @@ from .models import Blog # Register your models here. class BlogAdmin(admin.ModelAdmin): - list_display = ['title','author','content','author_name'] + list_display = ['title','author','content','create_time'] # author字段是关系表,必须用两条下划线指定对应属性 search_fields = ['title','content','author__username'] - # readonly_fields = ['author'] + readonly_fields = ['author','create_time'] - # # 保存模型时执行的操作 - # def save_model(self, request, obj, form, change): - # if not change: - # # 只有创建时指定作者 - # obj.author = request.user - # super(BlogAdmin, self).save_model(request,obj,form,change) + # 保存模型时执行的操作 + def save_model(self, request, obj, form, change): + if not change: + # 只有创建时指定作者 + obj.author = request.user + super(BlogAdmin, self).save_model(request,obj,form,change) admin.site.register(Blog,BlogAdmin) diff --git a/blog/migrations/0002_blog_createtime_blog_modifytime.py b/blog/migrations/0002_blog_createtime_blog_modifytime.py new file mode 100644 index 0000000..4de8070 --- /dev/null +++ b/blog/migrations/0002_blog_createtime_blog_modifytime.py @@ -0,0 +1,25 @@ +# Generated by Django 4.1.1 on 2022-09-17 17:30 + +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('blog', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='blog', + name='createTime', + field=models.DateField(auto_now_add=True, default=django.utils.timezone.now, verbose_name='创建时间'), + preserve_default=False, + ), + migrations.AddField( + model_name='blog', + name='modifyTime', + field=models.DateField(auto_now=True, verbose_name='修改时间'), + ), + ] diff --git a/blog/migrations/0003_alter_blog_createtime_alter_blog_modifytime.py b/blog/migrations/0003_alter_blog_createtime_alter_blog_modifytime.py new file mode 100644 index 0000000..279bb86 --- /dev/null +++ b/blog/migrations/0003_alter_blog_createtime_alter_blog_modifytime.py @@ -0,0 +1,23 @@ +# Generated by Django 4.1.1 on 2022-09-17 17:33 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('blog', '0002_blog_createtime_blog_modifytime'), + ] + + operations = [ + migrations.AlterField( + model_name='blog', + name='createTime', + field=models.DateTimeField(auto_now_add=True, verbose_name='创建时间'), + ), + migrations.AlterField( + model_name='blog', + name='modifyTime', + field=models.DateTimeField(auto_now=True, verbose_name='修改时间'), + ), + ] diff --git a/blog/migrations/0004_alter_blog_createtime_alter_blog_modifytime.py b/blog/migrations/0004_alter_blog_createtime_alter_blog_modifytime.py new file mode 100644 index 0000000..299a530 --- /dev/null +++ b/blog/migrations/0004_alter_blog_createtime_alter_blog_modifytime.py @@ -0,0 +1,23 @@ +# Generated by Django 4.1.1 on 2022-09-17 17:37 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('blog', '0003_alter_blog_createtime_alter_blog_modifytime'), + ] + + operations = [ + migrations.AlterField( + model_name='blog', + name='createTime', + field=models.DateField(auto_now_add=True, verbose_name='创建时间'), + ), + migrations.AlterField( + model_name='blog', + name='modifyTime', + field=models.DateField(auto_now=True, verbose_name='修改时间'), + ), + ] diff --git a/blog/migrations/0005_alter_blog_createtime_alter_blog_modifytime.py b/blog/migrations/0005_alter_blog_createtime_alter_blog_modifytime.py new file mode 100644 index 0000000..cfd3a45 --- /dev/null +++ b/blog/migrations/0005_alter_blog_createtime_alter_blog_modifytime.py @@ -0,0 +1,24 @@ +# Generated by Django 4.1.1 on 2022-09-17 17:40 + +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('blog', '0004_alter_blog_createtime_alter_blog_modifytime'), + ] + + operations = [ + migrations.AlterField( + model_name='blog', + name='createTime', + field=models.DateField(auto_now_add=True, verbose_name=django.utils.timezone.now), + ), + migrations.AlterField( + model_name='blog', + name='modifyTime', + field=models.DateField(auto_now=True, verbose_name=django.utils.timezone.now), + ), + ] diff --git a/blog/migrations/0006_alter_blog_createtime_alter_blog_modifytime.py b/blog/migrations/0006_alter_blog_createtime_alter_blog_modifytime.py new file mode 100644 index 0000000..42e25b5 --- /dev/null +++ b/blog/migrations/0006_alter_blog_createtime_alter_blog_modifytime.py @@ -0,0 +1,24 @@ +# Generated by Django 4.1.1 on 2022-09-17 17:43 + +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('blog', '0005_alter_blog_createtime_alter_blog_modifytime'), + ] + + operations = [ + migrations.AlterField( + model_name='blog', + name='createTime', + field=models.DateField(default=django.utils.timezone.now, verbose_name='创建时间'), + ), + migrations.AlterField( + model_name='blog', + name='modifyTime', + field=models.DateField(auto_now=True, verbose_name='修改时间'), + ), + ] diff --git a/blog/migrations/0007_alter_blog_createtime_alter_blog_modifytime.py b/blog/migrations/0007_alter_blog_createtime_alter_blog_modifytime.py new file mode 100644 index 0000000..6545089 --- /dev/null +++ b/blog/migrations/0007_alter_blog_createtime_alter_blog_modifytime.py @@ -0,0 +1,24 @@ +# Generated by Django 4.1.1 on 2022-09-17 17:44 + +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('blog', '0006_alter_blog_createtime_alter_blog_modifytime'), + ] + + operations = [ + migrations.AlterField( + model_name='blog', + name='createTime', + field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='创建时间'), + ), + migrations.AlterField( + model_name='blog', + name='modifyTime', + field=models.DateTimeField(auto_now=True, verbose_name='修改时间'), + ), + ] diff --git a/blog/migrations/0008_remove_blog_createtime_remove_blog_modifytime_and_more.py b/blog/migrations/0008_remove_blog_createtime_remove_blog_modifytime_and_more.py new file mode 100644 index 0000000..12ed14d --- /dev/null +++ b/blog/migrations/0008_remove_blog_createtime_remove_blog_modifytime_and_more.py @@ -0,0 +1,32 @@ +# Generated by Django 4.1.1 on 2022-09-17 18:00 + +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('blog', '0007_alter_blog_createtime_alter_blog_modifytime'), + ] + + operations = [ + migrations.RemoveField( + model_name='blog', + name='createTime', + ), + migrations.RemoveField( + model_name='blog', + name='modifyTime', + ), + migrations.AddField( + model_name='blog', + name='add_date', + field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='保存日期'), + ), + migrations.AddField( + model_name='blog', + name='mod_date', + field=models.DateTimeField(auto_now=True, verbose_name='最后修改日期'), + ), + ] diff --git a/blog/migrations/0009_remove_blog_add_date_remove_blog_mod_date_and_more.py b/blog/migrations/0009_remove_blog_add_date_remove_blog_mod_date_and_more.py new file mode 100644 index 0000000..448b7f7 --- /dev/null +++ b/blog/migrations/0009_remove_blog_add_date_remove_blog_mod_date_and_more.py @@ -0,0 +1,32 @@ +# Generated by Django 4.1.1 on 2022-09-17 18:04 + +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('blog', '0008_remove_blog_createtime_remove_blog_modifytime_and_more'), + ] + + operations = [ + migrations.RemoveField( + model_name='blog', + name='add_date', + ), + migrations.RemoveField( + model_name='blog', + name='mod_date', + ), + migrations.AddField( + model_name='blog', + name='create_time', + field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='创建时间'), + ), + migrations.AddField( + model_name='blog', + name='modify_time', + field=models.DateTimeField(auto_now=True, verbose_name='修改时间'), + ), + ] diff --git a/blog/models.py b/blog/models.py index b77622a..cc1f396 100644 --- a/blog/models.py +++ b/blog/models.py @@ -1,5 +1,5 @@ from django.db import models - +from django.utils import timezone # Create your models here. @@ -9,6 +9,9 @@ class Blog(models.Model): verbose_name='作者') content = models.TextField('内容') + create_time = models.DateTimeField('创建时间', default=timezone.now) + modify_time = models.DateTimeField('修改时间', auto_now=True) + def __str__(self): return self.title diff --git a/blog/urls.py b/blog/urls.py index 7278405..fb73c68 100644 --- a/blog/urls.py +++ b/blog/urls.py @@ -1,12 +1,13 @@ from django.urls import path -import blog.views as blog_views from blog.views.blogListView import BlogListView from blog.views.blogDetailView import BlogDetailView +import blog.view as blog_views urlpatterns = [ # path('list/', blog_views.blog_list, name='list'), # path('detail//', blog_views.blog_detail, name='detail') path('list/', BlogListView.as_view(), ), - path('detail//', BlogDetailView.as_view()) + path('detail//', BlogDetailView.as_view()), + path('index/',blog_views.index) ] \ No newline at end of file diff --git a/blog/views.py b/blog/view.py similarity index 92% rename from blog/views.py rename to blog/view.py index eb8bada..a8ec203 100644 --- a/blog/views.py +++ b/blog/view.py @@ -1,4 +1,6 @@ from django.http import JsonResponse,HttpResponse +from django.shortcuts import render + from blog.models import Blog from django.core.paginator import Paginator # 引入分页功能 @@ -47,3 +49,7 @@ def blog_detail(request,blog_id): ] } return HttpResponse(resp.values()) + + +def index(request): + return render(request, 'blog/index.html') \ No newline at end of file diff --git a/blog/views/blogListView.py b/blog/views/blogListView.py index 346ddca..21f908d 100644 --- a/blog/views/blogListView.py +++ b/blog/views/blogListView.py @@ -12,8 +12,8 @@ class BlogListView(BaseListView): return self.request.GET.get('page_size') or self.paginate_by def render_to_response(self, context): - paginator = context['paginator'] - current_page = context['page_obj'] + paginator = context['paginator'] # 分页 + current_page = context['page_obj'] # 页号 blogs = current_page.object_list data = { diff --git a/db.sqlite3 b/db.sqlite3 index 40fe5bb..0ef9399 100644 Binary files a/db.sqlite3 and b/db.sqlite3 differ diff --git a/demo/settings.py b/demo/settings.py index 86c3e80..fd82c16 100644 --- a/demo/settings.py +++ b/demo/settings.py @@ -1,16 +1,5 @@ -""" -Django settings for demo project. - -Generated by 'django-admin startproject' using Django 4.1.1. - -For more information on this file, see -https://docs.djangoproject.com/en/4.1/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/4.1/ref/settings/ -""" - from pathlib import Path +import os # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent @@ -31,13 +20,16 @@ ALLOWED_HOSTS = [] # Application definition INSTALLED_APPS = [ + 'rest_framework', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', - 'blog' + 'blog', + 'myapi', + 'snippets' ] MIDDLEWARE = [ @@ -107,19 +99,34 @@ AUTH_PASSWORD_VALIDATORS = [ LANGUAGE_CODE = 'en-us' -TIME_ZONE = 'UTC' +TIME_ZONE = 'Asia/Shanghai' USE_I18N = True -USE_TZ = True +USE_TZ = False # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/4.1/howto/static-files/ STATIC_URL = 'static/' +STATICFILES_DIRS=( + os.path.join(BASE_DIR,'static'), +) # Default primary key field type # https://docs.djangoproject.com/en/4.1/ref/settings/#default-auto-field DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' + + +REST_FRAMEWORK = { + # Use Django's standard `django.contrib.auth` permissions, + # or allow read-only access for unauthenticated users. + 'DEFAULT_PERMISSION_CLASSES': [ + # 'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly', + ], + 'DEFAULT_PAGINATION_CLASS': + 'rest_framework.pagination.PageNumberPagination', + 'PAGE_SIZE': 10, +} diff --git a/demo/urls.py b/demo/urls.py index 59d0933..ecc5219 100644 --- a/demo/urls.py +++ b/demo/urls.py @@ -18,5 +18,7 @@ from django.urls import path,include urlpatterns = [ path('admin/', admin.site.urls), - path('blog/', include('blog.urls')) + path('blog/', include('blog.urls')), + path('myapi/',include('myapi.urls')), + path('',include('snippets.urls')), ] diff --git a/myapi/__init__.py b/myapi/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/myapi/admin.py b/myapi/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/myapi/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/myapi/apps.py b/myapi/apps.py new file mode 100644 index 0000000..d3c4e44 --- /dev/null +++ b/myapi/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class MyapiConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'myapi' diff --git a/myapi/migrations/__init__.py b/myapi/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/myapi/models.py b/myapi/models.py new file mode 100644 index 0000000..71a8362 --- /dev/null +++ b/myapi/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/myapi/serializers.py b/myapi/serializers.py new file mode 100644 index 0000000..0276919 --- /dev/null +++ b/myapi/serializers.py @@ -0,0 +1,16 @@ +from django.contrib.auth.models import User, Group +from rest_framework import serializers + + +class UserSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = User + fields = ['url', 'username', 'email', 'groups'] + + +class GroupSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = Group + fields = ['url', 'name'] + + \ No newline at end of file diff --git a/myapi/tests.py b/myapi/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/myapi/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/myapi/urls.py b/myapi/urls.py new file mode 100644 index 0000000..3d4a3db --- /dev/null +++ b/myapi/urls.py @@ -0,0 +1,13 @@ +from django.urls import path, include +from rest_framework import routers +from myapi import views + + +router = routers.DefaultRouter() +router.register(r'users', views.UserViewSet) +router.register(r'groups', views.GroupViewSet) + +urlpatterns = [ + path('', include(router.urls)), + path('api-auth/', include('rest_framework.urls', namespace='rest_framework')) +] diff --git a/myapi/views.py b/myapi/views.py new file mode 100644 index 0000000..82b2e0f --- /dev/null +++ b/myapi/views.py @@ -0,0 +1,16 @@ +from django.contrib.auth.models import User, Group +from rest_framework import viewsets +from rest_framework import permissions +from myapi.serializers import UserSerializer,GroupSerializer + + +class UserViewSet(viewsets.ModelViewSet): + queryset = User.objects.all().order_by('date_joined') + serializer_class = UserSerializer + permissions_classes = [permissions.IsAuthenticated] + + +class GroupViewSet(viewsets.ModelViewSet): + queryset = Group.objects.all() + serializer_class = GroupSerializer + permissions_classes = [permissions.IsAuthenticated] diff --git a/snippets/__init__.py b/snippets/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/snippets/admin.py b/snippets/admin.py new file mode 100644 index 0000000..64d2e34 --- /dev/null +++ b/snippets/admin.py @@ -0,0 +1,5 @@ +from django.contrib import admin +from snippets.models import Snippet + +# Register your models here. +admin.site.register(Snippet) \ No newline at end of file diff --git a/snippets/apps.py b/snippets/apps.py new file mode 100644 index 0000000..33dd0be --- /dev/null +++ b/snippets/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class SnippetsConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'snippets' diff --git a/snippets/migrations/0001_initial.py b/snippets/migrations/0001_initial.py new file mode 100644 index 0000000..2096deb --- /dev/null +++ b/snippets/migrations/0001_initial.py @@ -0,0 +1,29 @@ +# Generated by Django 4.1.1 on 2022-09-18 16:37 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Snippet', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', models.DateTimeField(auto_now_add=True)), + ('title', models.CharField(blank=True, default='', max_length=100)), + ('code', models.TextField()), + ('linenos', models.BooleanField(default=False)), + ('language', models.CharField(choices=[('abap', 'ABAP'), ('abnf', 'ABNF'), ('actionscript', 'ActionScript'), ('actionscript3', 'ActionScript 3'), ('ada', 'Ada'), ('adl', 'ADL'), ('agda', 'Agda'), ('aheui', 'Aheui'), ('alloy', 'Alloy'), ('ambienttalk', 'AmbientTalk'), ('amdgpu', 'AMDGPU'), ('ampl', 'Ampl'), ('ansys', 'ANSYS parametric design language'), ('antlr', 'ANTLR'), ('antlr-actionscript', 'ANTLR With ActionScript Target'), ('antlr-cpp', 'ANTLR With CPP Target'), ('antlr-csharp', 'ANTLR With C# Target'), ('antlr-java', 'ANTLR With Java Target'), ('antlr-objc', 'ANTLR With ObjectiveC Target'), ('antlr-perl', 'ANTLR With Perl Target'), ('antlr-python', 'ANTLR With Python Target'), ('antlr-ruby', 'ANTLR With Ruby Target'), ('apacheconf', 'ApacheConf'), ('apl', 'APL'), ('applescript', 'AppleScript'), ('arduino', 'Arduino'), ('arrow', 'Arrow'), ('asc', 'ASCII armored'), ('aspectj', 'AspectJ'), ('aspx-cs', 'aspx-cs'), ('aspx-vb', 'aspx-vb'), ('asymptote', 'Asymptote'), ('augeas', 'Augeas'), ('autohotkey', 'autohotkey'), ('autoit', 'AutoIt'), ('awk', 'Awk'), ('bare', 'BARE'), ('basemake', 'Base Makefile'), ('bash', 'Bash'), ('batch', 'Batchfile'), ('bbcbasic', 'BBC Basic'), ('bbcode', 'BBCode'), ('bc', 'BC'), ('bdd', 'Bdd'), ('befunge', 'Befunge'), ('berry', 'Berry'), ('bibtex', 'BibTeX'), ('blitzbasic', 'BlitzBasic'), ('blitzmax', 'BlitzMax'), ('bnf', 'BNF'), ('boa', 'Boa'), ('boo', 'Boo'), ('boogie', 'Boogie'), ('brainfuck', 'Brainfuck'), ('bst', 'BST'), ('bugs', 'BUGS'), ('c', 'C'), ('c-objdump', 'c-objdump'), ('ca65', 'ca65 assembler'), ('cadl', 'cADL'), ('camkes', 'CAmkES'), ('capdl', 'CapDL'), ('capnp', "Cap'n Proto"), ('cbmbas', 'CBM BASIC V2'), ('cddl', 'CDDL'), ('ceylon', 'Ceylon'), ('cfc', 'Coldfusion CFC'), ('cfengine3', 'CFEngine3'), ('cfm', 'Coldfusion HTML'), ('cfs', 'cfstatement'), ('chaiscript', 'ChaiScript'), ('chapel', 'Chapel'), ('charmci', 'Charmci'), ('cheetah', 'Cheetah'), ('cirru', 'Cirru'), ('clay', 'Clay'), ('clean', 'Clean'), ('clojure', 'Clojure'), ('clojurescript', 'ClojureScript'), ('cmake', 'CMake'), ('cobol', 'COBOL'), ('cobolfree', 'COBOLFree'), ('coffeescript', 'CoffeeScript'), ('comal', 'COMAL-80'), ('common-lisp', 'Common Lisp'), ('componentpascal', 'Component Pascal'), ('console', 'Bash Session'), ('coq', 'Coq'), ('cplint', 'cplint'), ('cpp', 'C++'), ('cpp-objdump', 'cpp-objdump'), ('cpsa', 'CPSA'), ('cr', 'Crystal'), ('crmsh', 'Crmsh'), ('croc', 'Croc'), ('cryptol', 'Cryptol'), ('csharp', 'C#'), ('csound', 'Csound Orchestra'), ('csound-document', 'Csound Document'), ('csound-score', 'Csound Score'), ('css', 'CSS'), ('css+django', 'CSS+Django/Jinja'), ('css+genshitext', 'CSS+Genshi Text'), ('css+lasso', 'CSS+Lasso'), ('css+mako', 'CSS+Mako'), ('css+mozpreproc', 'CSS+mozpreproc'), ('css+myghty', 'CSS+Myghty'), ('css+php', 'CSS+PHP'), ('css+ruby', 'CSS+Ruby'), ('css+smarty', 'CSS+Smarty'), ('css+ul4', 'CSS+UL4'), ('cuda', 'CUDA'), ('cypher', 'Cypher'), ('cython', 'Cython'), ('d', 'D'), ('d-objdump', 'd-objdump'), ('dart', 'Dart'), ('dasm16', 'DASM16'), ('debcontrol', 'Debian Control file'), ('debsources', 'Debian Sourcelist'), ('delphi', 'Delphi'), ('devicetree', 'Devicetree'), ('dg', 'dg'), ('diff', 'Diff'), ('django', 'Django/Jinja'), ('docker', 'Docker'), ('doscon', 'MSDOS Session'), ('dpatch', 'Darcs Patch'), ('dtd', 'DTD'), ('duel', 'Duel'), ('dylan', 'Dylan'), ('dylan-console', 'Dylan session'), ('dylan-lid', 'DylanLID'), ('earl-grey', 'Earl Grey'), ('easytrieve', 'Easytrieve'), ('ebnf', 'EBNF'), ('ec', 'eC'), ('ecl', 'ECL'), ('eiffel', 'Eiffel'), ('elixir', 'Elixir'), ('elm', 'Elm'), ('elpi', 'Elpi'), ('emacs-lisp', 'EmacsLisp'), ('email', 'E-mail'), ('erb', 'ERB'), ('erl', 'Erlang erl session'), ('erlang', 'Erlang'), ('evoque', 'Evoque'), ('execline', 'execline'), ('extempore', 'xtlang'), ('ezhil', 'Ezhil'), ('factor', 'Factor'), ('fan', 'Fantom'), ('fancy', 'Fancy'), ('felix', 'Felix'), ('fennel', 'Fennel'), ('fish', 'Fish'), ('flatline', 'Flatline'), ('floscript', 'FloScript'), ('forth', 'Forth'), ('fortran', 'Fortran'), ('fortranfixed', 'FortranFixed'), ('foxpro', 'FoxPro'), ('freefem', 'Freefem'), ('fsharp', 'F#'), ('fstar', 'FStar'), ('futhark', 'Futhark'), ('gap', 'GAP'), ('gas', 'GAS'), ('gcode', 'g-code'), ('gdscript', 'GDScript'), ('genshi', 'Genshi'), ('genshitext', 'Genshi Text'), ('gherkin', 'Gherkin'), ('glsl', 'GLSL'), ('gnuplot', 'Gnuplot'), ('go', 'Go'), ('golo', 'Golo'), ('gooddata-cl', 'GoodData-CL'), ('gosu', 'Gosu'), ('graphviz', 'Graphviz'), ('groff', 'Groff'), ('groovy', 'Groovy'), ('gsql', 'GSQL'), ('gst', 'Gosu Template'), ('haml', 'Haml'), ('handlebars', 'Handlebars'), ('haskell', 'Haskell'), ('haxe', 'Haxe'), ('haxeml', 'Hxml'), ('hexdump', 'Hexdump'), ('hlsl', 'HLSL'), ('hsail', 'HSAIL'), ('hspec', 'Hspec'), ('html', 'HTML'), ('html+cheetah', 'HTML+Cheetah'), ('html+django', 'HTML+Django/Jinja'), ('html+evoque', 'HTML+Evoque'), ('html+genshi', 'HTML+Genshi'), ('html+handlebars', 'HTML+Handlebars'), ('html+lasso', 'HTML+Lasso'), ('html+mako', 'HTML+Mako'), ('html+myghty', 'HTML+Myghty'), ('html+ng2', 'HTML + Angular2'), ('html+php', 'HTML+PHP'), ('html+smarty', 'HTML+Smarty'), ('html+twig', 'HTML+Twig'), ('html+ul4', 'HTML+UL4'), ('html+velocity', 'HTML+Velocity'), ('http', 'HTTP'), ('hybris', 'Hybris'), ('hylang', 'Hy'), ('i6t', 'Inform 6 template'), ('icon', 'Icon'), ('idl', 'IDL'), ('idris', 'Idris'), ('iex', 'Elixir iex session'), ('igor', 'Igor'), ('inform6', 'Inform 6'), ('inform7', 'Inform 7'), ('ini', 'INI'), ('io', 'Io'), ('ioke', 'Ioke'), ('irc', 'IRC logs'), ('isabelle', 'Isabelle'), ('j', 'J'), ('jags', 'JAGS'), ('jasmin', 'Jasmin'), ('java', 'Java'), ('javascript', 'JavaScript'), ('javascript+cheetah', 'JavaScript+Cheetah'), ('javascript+django', 'JavaScript+Django/Jinja'), ('javascript+lasso', 'JavaScript+Lasso'), ('javascript+mako', 'JavaScript+Mako'), ('javascript+mozpreproc', 'Javascript+mozpreproc'), ('javascript+myghty', 'JavaScript+Myghty'), ('javascript+php', 'JavaScript+PHP'), ('javascript+ruby', 'JavaScript+Ruby'), ('javascript+smarty', 'JavaScript+Smarty'), ('jcl', 'JCL'), ('jlcon', 'Julia console'), ('jmespath', 'JMESPath'), ('js+genshitext', 'JavaScript+Genshi Text'), ('js+ul4', 'Javascript+UL4'), ('jsgf', 'JSGF'), ('jslt', 'JSLT'), ('json', 'JSON'), ('jsonld', 'JSON-LD'), ('jsp', 'Java Server Page'), ('julia', 'Julia'), ('juttle', 'Juttle'), ('k', 'K'), ('kal', 'Kal'), ('kconfig', 'Kconfig'), ('kmsg', 'Kernel log'), ('koka', 'Koka'), ('kotlin', 'Kotlin'), ('kuin', 'Kuin'), ('lasso', 'Lasso'), ('lean', 'Lean'), ('less', 'LessCss'), ('lighttpd', 'Lighttpd configuration file'), ('lilypond', 'LilyPond'), ('limbo', 'Limbo'), ('liquid', 'liquid'), ('literate-agda', 'Literate Agda'), ('literate-cryptol', 'Literate Cryptol'), ('literate-haskell', 'Literate Haskell'), ('literate-idris', 'Literate Idris'), ('livescript', 'LiveScript'), ('llvm', 'LLVM'), ('llvm-mir', 'LLVM-MIR'), ('llvm-mir-body', 'LLVM-MIR Body'), ('logos', 'Logos'), ('logtalk', 'Logtalk'), ('lsl', 'LSL'), ('lua', 'Lua'), ('macaulay2', 'Macaulay2'), ('make', 'Makefile'), ('mako', 'Mako'), ('maql', 'MAQL'), ('markdown', 'Markdown'), ('mask', 'Mask'), ('mason', 'Mason'), ('mathematica', 'Mathematica'), ('matlab', 'Matlab'), ('matlabsession', 'Matlab session'), ('maxima', 'Maxima'), ('mcfunction', 'MCFunction'), ('meson', 'Meson'), ('mime', 'MIME'), ('minid', 'MiniD'), ('miniscript', 'MiniScript'), ('modelica', 'Modelica'), ('modula2', 'Modula-2'), ('monkey', 'Monkey'), ('monte', 'Monte'), ('moocode', 'MOOCode'), ('moonscript', 'MoonScript'), ('mosel', 'Mosel'), ('mozhashpreproc', 'mozhashpreproc'), ('mozpercentpreproc', 'mozpercentpreproc'), ('mql', 'MQL'), ('mscgen', 'Mscgen'), ('mupad', 'MuPAD'), ('mxml', 'MXML'), ('myghty', 'Myghty'), ('mysql', 'MySQL'), ('nasm', 'NASM'), ('ncl', 'NCL'), ('nemerle', 'Nemerle'), ('nesc', 'nesC'), ('nestedtext', 'NestedText'), ('newlisp', 'NewLisp'), ('newspeak', 'Newspeak'), ('ng2', 'Angular2'), ('nginx', 'Nginx configuration file'), ('nimrod', 'Nimrod'), ('nit', 'Nit'), ('nixos', 'Nix'), ('nodejsrepl', 'Node.js REPL console session'), ('notmuch', 'Notmuch'), ('nsis', 'NSIS'), ('numpy', 'NumPy'), ('nusmv', 'NuSMV'), ('objdump', 'objdump'), ('objdump-nasm', 'objdump-nasm'), ('objective-c', 'Objective-C'), ('objective-c++', 'Objective-C++'), ('objective-j', 'Objective-J'), ('ocaml', 'OCaml'), ('octave', 'Octave'), ('odin', 'ODIN'), ('omg-idl', 'OMG Interface Definition Language'), ('ooc', 'Ooc'), ('opa', 'Opa'), ('openedge', 'OpenEdge ABL'), ('output', 'Text output'), ('pacmanconf', 'PacmanConf'), ('pan', 'Pan'), ('parasail', 'ParaSail'), ('pawn', 'Pawn'), ('peg', 'PEG'), ('perl', 'Perl'), ('perl6', 'Perl6'), ('php', 'PHP'), ('pig', 'Pig'), ('pike', 'Pike'), ('pkgconfig', 'PkgConfig'), ('plpgsql', 'PL/pgSQL'), ('pointless', 'Pointless'), ('pony', 'Pony'), ('postgresql', 'PostgreSQL SQL dialect'), ('postscript', 'PostScript'), ('pot', 'Gettext Catalog'), ('pov', 'POVRay'), ('powershell', 'PowerShell'), ('praat', 'Praat'), ('procfile', 'Procfile'), ('prolog', 'Prolog'), ('promql', 'PromQL'), ('properties', 'Properties'), ('protobuf', 'Protocol Buffer'), ('psql', 'PostgreSQL console (psql)'), ('psysh', 'PsySH console session for PHP'), ('pug', 'Pug'), ('puppet', 'Puppet'), ('pwsh-session', 'PowerShell Session'), ('py+ul4', 'Python+UL4'), ('py2tb', 'Python 2.x Traceback'), ('pycon', 'Python console session'), ('pypylog', 'PyPy Log'), ('pytb', 'Python Traceback'), ('python', 'Python'), ('python2', 'Python 2.x'), ('q', 'Q'), ('qbasic', 'QBasic'), ('qlik', 'Qlik'), ('qml', 'QML'), ('qvto', 'QVTO'), ('racket', 'Racket'), ('ragel', 'Ragel'), ('ragel-c', 'Ragel in C Host'), ('ragel-cpp', 'Ragel in CPP Host'), ('ragel-d', 'Ragel in D Host'), ('ragel-em', 'Embedded Ragel'), ('ragel-java', 'Ragel in Java Host'), ('ragel-objc', 'Ragel in Objective C Host'), ('ragel-ruby', 'Ragel in Ruby Host'), ('rbcon', 'Ruby irb session'), ('rconsole', 'RConsole'), ('rd', 'Rd'), ('reasonml', 'ReasonML'), ('rebol', 'REBOL'), ('red', 'Red'), ('redcode', 'Redcode'), ('registry', 'reg'), ('resourcebundle', 'ResourceBundle'), ('restructuredtext', 'reStructuredText'), ('rexx', 'Rexx'), ('rhtml', 'RHTML'), ('ride', 'Ride'), ('rita', 'Rita'), ('rng-compact', 'Relax-NG Compact'), ('roboconf-graph', 'Roboconf Graph'), ('roboconf-instances', 'Roboconf Instances'), ('robotframework', 'RobotFramework'), ('rql', 'RQL'), ('rsl', 'RSL'), ('ruby', 'Ruby'), ('rust', 'Rust'), ('sarl', 'SARL'), ('sas', 'SAS'), ('sass', 'Sass'), ('savi', 'Savi'), ('scala', 'Scala'), ('scaml', 'Scaml'), ('scdoc', 'scdoc'), ('scheme', 'Scheme'), ('scilab', 'Scilab'), ('scss', 'SCSS'), ('sed', 'Sed'), ('sgf', 'SmartGameFormat'), ('shen', 'Shen'), ('shexc', 'ShExC'), ('sieve', 'Sieve'), ('silver', 'Silver'), ('singularity', 'Singularity'), ('slash', 'Slash'), ('slim', 'Slim'), ('slurm', 'Slurm'), ('smali', 'Smali'), ('smalltalk', 'Smalltalk'), ('smarty', 'Smarty'), ('smithy', 'Smithy'), ('sml', 'Standard ML'), ('snbt', 'SNBT'), ('snobol', 'Snobol'), ('snowball', 'Snowball'), ('solidity', 'Solidity'), ('sophia', 'Sophia'), ('sp', 'SourcePawn'), ('sparql', 'SPARQL'), ('spec', 'RPMSpec'), ('spice', 'Spice'), ('splus', 'S'), ('sql', 'SQL'), ('sql+jinja', 'SQL+Jinja'), ('sqlite3', 'sqlite3con'), ('squidconf', 'SquidConf'), ('srcinfo', 'Srcinfo'), ('ssp', 'Scalate Server Page'), ('stan', 'Stan'), ('stata', 'Stata'), ('supercollider', 'SuperCollider'), ('swift', 'Swift'), ('swig', 'SWIG'), ('systemverilog', 'systemverilog'), ('tads3', 'TADS 3'), ('tal', 'Tal'), ('tap', 'TAP'), ('tasm', 'TASM'), ('tcl', 'Tcl'), ('tcsh', 'Tcsh'), ('tcshcon', 'Tcsh Session'), ('tea', 'Tea'), ('teal', 'teal'), ('teratermmacro', 'Tera Term macro'), ('termcap', 'Termcap'), ('terminfo', 'Terminfo'), ('terraform', 'Terraform'), ('tex', 'TeX'), ('text', 'Text only'), ('thrift', 'Thrift'), ('ti', 'ThingsDB'), ('tid', 'tiddler'), ('tnt', 'Typographic Number Theory'), ('todotxt', 'Todotxt'), ('toml', 'TOML'), ('trac-wiki', 'MoinMoin/Trac Wiki markup'), ('trafficscript', 'TrafficScript'), ('treetop', 'Treetop'), ('tsql', 'Transact-SQL'), ('turtle', 'Turtle'), ('twig', 'Twig'), ('typescript', 'TypeScript'), ('typoscript', 'TypoScript'), ('typoscriptcssdata', 'TypoScriptCssData'), ('typoscripthtmldata', 'TypoScriptHtmlData'), ('ucode', 'ucode'), ('ul4', 'UL4'), ('unicon', 'Unicon'), ('unixconfig', 'Unix/Linux config files'), ('urbiscript', 'UrbiScript'), ('usd', 'USD'), ('vala', 'Vala'), ('vb.net', 'VB.net'), ('vbscript', 'VBScript'), ('vcl', 'VCL'), ('vclsnippets', 'VCLSnippets'), ('vctreestatus', 'VCTreeStatus'), ('velocity', 'Velocity'), ('verilog', 'verilog'), ('vgl', 'VGL'), ('vhdl', 'vhdl'), ('vim', 'VimL'), ('wast', 'WebAssembly'), ('wdiff', 'WDiff'), ('webidl', 'Web IDL'), ('whiley', 'Whiley'), ('x10', 'X10'), ('xml', 'XML'), ('xml+cheetah', 'XML+Cheetah'), ('xml+django', 'XML+Django/Jinja'), ('xml+evoque', 'XML+Evoque'), ('xml+lasso', 'XML+Lasso'), ('xml+mako', 'XML+Mako'), ('xml+myghty', 'XML+Myghty'), ('xml+php', 'XML+PHP'), ('xml+ruby', 'XML+Ruby'), ('xml+smarty', 'XML+Smarty'), ('xml+ul4', 'XML+UL4'), ('xml+velocity', 'XML+Velocity'), ('xorg.conf', 'Xorg'), ('xquery', 'XQuery'), ('xslt', 'XSLT'), ('xtend', 'Xtend'), ('xul+mozpreproc', 'XUL+mozpreproc'), ('yaml', 'YAML'), ('yaml+jinja', 'YAML+Jinja'), ('yang', 'YANG'), ('zeek', 'Zeek'), ('zephir', 'Zephir'), ('zig', 'Zig')], default='python', max_length=100)), + ('style', models.CharField(choices=[('abap', 'abap'), ('algol', 'algol'), ('algol_nu', 'algol_nu'), ('arduino', 'arduino'), ('autumn', 'autumn'), ('borland', 'borland'), ('bw', 'bw'), ('colorful', 'colorful'), ('default', 'default'), ('dracula', 'dracula'), ('emacs', 'emacs'), ('friendly', 'friendly'), ('friendly_grayscale', 'friendly_grayscale'), ('fruity', 'fruity'), ('github-dark', 'github-dark'), ('gruvbox-dark', 'gruvbox-dark'), ('gruvbox-light', 'gruvbox-light'), ('igor', 'igor'), ('inkpot', 'inkpot'), ('lilypond', 'lilypond'), ('lovelace', 'lovelace'), ('manni', 'manni'), ('material', 'material'), ('monokai', 'monokai'), ('murphy', 'murphy'), ('native', 'native'), ('nord', 'nord'), ('nord-darker', 'nord-darker'), ('one-dark', 'one-dark'), ('paraiso-dark', 'paraiso-dark'), ('paraiso-light', 'paraiso-light'), ('pastie', 'pastie'), ('perldoc', 'perldoc'), ('rainbow_dash', 'rainbow_dash'), ('rrt', 'rrt'), ('sas', 'sas'), ('solarized-dark', 'solarized-dark'), ('solarized-light', 'solarized-light'), ('staroffice', 'staroffice'), ('stata', 'stata'), ('stata-dark', 'stata-dark'), ('stata-light', 'stata-light'), ('tango', 'tango'), ('trac', 'trac'), ('vim', 'vim'), ('vs', 'vs'), ('xcode', 'xcode'), ('zenburn', 'zenburn')], default='friendly', max_length=100)), + ], + options={ + 'ordering': ['created'], + }, + ), + ] diff --git a/snippets/migrations/__init__.py b/snippets/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/snippets/models.py b/snippets/models.py new file mode 100644 index 0000000..4c9a4c8 --- /dev/null +++ b/snippets/models.py @@ -0,0 +1,23 @@ +from django.db import models +from pygments.lexers import get_all_lexers +from pygments.styles import get_all_styles + +LEXERS = [item for item in get_all_lexers() if item[1]] +LANGUAGE_CHOICES = sorted([(item[1][0],item[0]) for item in LEXERS]) +STYLE_CHOICES = sorted([(item,item) for item in get_all_styles()]) + + +class Snippet(models.Model): + created = models.DateTimeField(auto_now_add=True) + title = models.CharField(max_length=100,blank=True,default='') + code = models.TextField() + linenos = models.BooleanField(default=False) + language = models.CharField(choices=LANGUAGE_CHOICES,default='python',max_length=100) + style = models.CharField(choices=STYLE_CHOICES, default='friendly',max_length=100) + + def __str__(self): + return str(self.id) + ' ' + self.title + ' ' + self.code + + class Meta: + ordering = ['created'] + diff --git a/snippets/serializers.py b/snippets/serializers.py new file mode 100644 index 0000000..3be8cec --- /dev/null +++ b/snippets/serializers.py @@ -0,0 +1,29 @@ +from rest_framework import serializers +from snippets.models import Snippet, LANGUAGE_CHOICES, STYLE_CHOICES + + +# class SnippetSerializer(serializers.Serializer): +# id = serializers.IntegerField(read_only=True) +# title = serializers.CharField(required=False, allow_blank=True, max_length=100) +# code = serializers.CharField(style={'base_template': 'textarea.html'}) +# linenos = serializers.BooleanField(required=False) +# language = serializers.ChoiceField(choices=LANGUAGE_CHOICES,default='python') +# style = serializers.ChoiceField(choices=STYLE_CHOICES, default='friendly') +# +# def create(self, validated_data): +# return Snippet.objects.create(**validated_data) +# +# def update(self, instance, validated_data): +# instance.title = validated_data.get('title', instance.title) +# instance.code = validated_data.get('code', instance.code) +# instance.linenos = validated_data.get('linenos', instance.linenos) +# instance.language = validated_data.get('language', instance.language) +# instance.style = validated_data.get('style', instance.style) +# instance.save() +# return instance + + +class SnippetSerializer(serializers.ModelSerializer): + class Meta: + model = Snippet + fields = ['id','created','title','code','linenos','language','style'] diff --git a/snippets/tests.py b/snippets/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/snippets/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/snippets/urls.py b/snippets/urls.py new file mode 100644 index 0000000..b145261 --- /dev/null +++ b/snippets/urls.py @@ -0,0 +1,12 @@ +from django.urls import path +from rest_framework.urlpatterns import format_suffix_patterns + +from snippets.views import SnippetView,SnippetDetailView + +urlpatterns = [ + path('snippets/',SnippetView.as_view()), + path('snippet//',SnippetDetailView.as_view()), +] + + +urlpatterns = format_suffix_patterns(urlpatterns) diff --git a/snippets/views.py b/snippets/views.py new file mode 100644 index 0000000..8a2c5db --- /dev/null +++ b/snippets/views.py @@ -0,0 +1,134 @@ +from rest_framework.response import Response +from rest_framework.status import HTTP_400_BAD_REQUEST, HTTP_204_NO_CONTENT, HTTP_201_CREATED +from django.http import Http404 +from snippets.models import Snippet +from snippets.serializers import SnippetSerializer +from rest_framework.views import APIView + +# @csrf_exempt +# def snippet_list(request): +# if request.method == 'GET': +# snippets = Snippet.objects.all() +# serializer = SnippetSerializer(snippets,many=True) +# return JsonResponse(serializer.data,safe=False) +# +# elif request.method == 'POST': +# data = JSONParser().parse(request) +# serializer = SnippetSerializer(data=data) # 序列化成JSON格式 +# if serializer.is_valid(): +# serializer.save() +# return JsonResponse(serializer.data,status=HTTP_201_CREATED) +# return JsonResponse(serializer.errors, status=HTTP_400_BAD_REQUEST) +# +# @csrf_exempt +# def snippet_detail(request,pk): +# try: +# snippet = Snippet.objects.get(pk=pk) +# except Snippet.DoesNotExist: +# return HttpResponse(status=HTTP_400_BAD_REQUEST) +# +# if request.method == 'GET': +# serializer = SnippetSerializer(snippet) +# return JsonResponse(serializer.data) +# +# elif request.method == 'PUT': +# data = JSONParser().parse(request) +# serializer = SnippetSerializer(data=data) +# if serializer.is_valid(): +# serializer.save() +# return JsonResponse(serializer.data) +# return JsonResponse(serializer.errors,status=HTTP_400_BAD_REQUEST) +# +# elif request.method == 'DELETE': +# snippet.delete() +# return HttpResponse(status=HTTP_204_NO_CONTENT) + + +# @api_view(['GET', 'POST']) +# def snippet_list(request, format=None): +# if request.method == 'GET': +# snippets = Snippet.objects.all() +# serializer = SnippetSerializer(snippets,many=True) +# return Response(serializer.data) +# +# elif request.method == 'POST': +# # 序列化成JSON格式 +# serializer = SnippetSerializer(data=request.data) +# if serializer.is_valid(): +# serializer.save() +# return Response(serializer.data, status=HTTP_201_CREATED) +# return Response(serializer.errors, status=HTTP_400_BAD_REQUEST) + +# +# @api_view(['GET', 'PUT', 'DELETE']) +# def snippet_detail(request, pk, format=None): +# try: +# snippet = Snippet.objects.get(pk=pk) +# except Snippet.DoesNotExist: +# return Response(status=HTTP_400_BAD_REQUEST) +# +# if request.method == 'GET': +# serializer = SnippetSerializer(snippet) +# return Response(serializer.data) +# +# elif request.method == 'PUT': +# serializer = SnippetSerializer(snippet,data=request.data) +# if serializer.is_valid(): +# serializer.save() +# return Response(serializer.data) +# return Response(serializer.errors,status=HTTP_400_BAD_REQUEST) +# +# elif request.method == 'DELETE': +# snippet.delete() +# return Response(status=HTTP_204_NO_CONTENT) + + + +class SnippetView(APIView): + # 获取所有的snippet + def get(self, request, format=None): + snippets = Snippet.objects.all() + serializer = SnippetSerializer(snippets, many=True) + return Response(serializer.data) + + # 创建一个新的snippet + def post(self, request, format=None): + serializer = SnippetSerializer(data=request.data) + if serializer.is_valid(): + serializer.save() + return Response(serializer.data,status=HTTP_201_CREATED) + return Response(status=HTTP_400_BAD_REQUEST) + + +class SnippetDetailView(APIView): + def get_object(self, pk): + try: + return Snippet.objects.get(pk=pk) + except Snippet.DoesNotExist: + return Http404 + + # 查询某个snippet的数据 + def get(self,request,pk,format=None): + snippet = self.get_object(pk) + serializer = SnippetSerializer(snippet) + return Response(serializer.data) + + # 更新某个snippet的数据 + def put(self,request,pk,format=None): + snippet = self.get_object(pk) + serializer = SnippetSerializer(snippet,data=request.data) + if serializer.is_valid(): + serializer.save() + return Response(serializer.data) + return Response(status=HTTP_400_BAD_REQUEST) + + # 删除某一个snippet + def delete(self,request,pk,format=None): + snippet = self.get_object(pk) + snippet.delete() + return Response(status=HTTP_204_NO_CONTENT) + + + + + diff --git a/static/images/apple.png b/static/images/apple.png new file mode 100644 index 0000000..cbfdb12 Binary files /dev/null and b/static/images/apple.png differ diff --git a/templates/blog/index.html b/templates/blog/index.html new file mode 100644 index 0000000..ea7c094 --- /dev/null +++ b/templates/blog/index.html @@ -0,0 +1,40 @@ +{% load static %} + + + + + + + Document + + + +

blog欢迎界面

+
+ +
    + {% for blog in blog_ %} +
+
+ + + + \ No newline at end of file