第一次使用django开发网页遇到的问题

来源:互联网 发布:开淘宝店怎么刷销量 编辑:程序博客网 时间:2024/05/21 10:06

撰写时间:2017.6.15晚

—今天太晚了,只是整理了材料,明天再统一整理一下—-

系统环境:ubuntu14.04,django1.11,python2.7

首先安利一波django,确实是很好用的套件,其中关于数据库的操作让我有点佩服,基本我想要的他都能找到API,给人一种恰到好处的感觉!但是寻找API的过程是比较痛苦的,还有就是作为新手,对django不熟,是很痛苦的经历.而且在学习django的过程中一定要知其然,而且知其所以然,才能熟练使用他,而我只是课程作业用一次,我以后应该用的比较少.遇到的问题记录一下,权当笔记.

版本 django1.11,不同版本就不要看了!

下面的博客内容有很多主观臆测的东西…因为我压根就没有仔细读他的文档…

还有这篇文档不是交你怎么做django的,只是我遇到的问题的集合,如果你恰好和我版本一样,而且也遇到了这个问题,就可以参看一下!

项目讲解

首先描述我的项目,不然下面的问题也无从讲解
本项目是一个django实现的论文数据库管理系统,论文数据来自与dblp,从中拆剪了60M的文件,总计数据有13w条数据,然后通过漫长的数据分析.生成了四个表:article,author,journal,article_author,

数据库概念模型

这里写图片描述

代码实现

# -*- coding: utf-8 -*-from __future__ import unicode_literalsfrom django.db import modelsfrom django.db import connection,transactionclass articleManager(models.Manager):    #select    # def select_by_article_title(self,articleTitle):    #     return super(articleManager, self).get_queryset()    def select_by_journal_id(self,journalID):        #return super(articleManager, self).get_queryset().filter(journal_id__in = journalID)        return super(articleManager, self).get_queryset().filter(            journal_id__in = journalID).select_related('journal').prefetch_related('author_set')        #sql = """select * from papermodel_article where article_id=1"""        #return super(articleManager, self).raw(sql);     #create tables.class article(models.Model):    article_id = models.AutoField(primary_key=True,auto_created=True)    article_title = models.CharField(max_length = 1024);    article_year = models.IntegerField();    article_volume = models.IntegerField();    journal = models.ForeignKey('journal')    url = models.CharField(max_length=81,null=True)    object = articleManager()    def __unicode__(self):        return u'{} {}'.format(self.article_title,self.article_year)class authorManager(models.Manager):    #select    def select_by_author_name(self,authorName):        return super(authorManager,self).get_queryset().filter(author_name__contains='Juha')class author(models.Model):    author_id = models.AutoField(primary_key=True,auto_created=True)    author_name = models.CharField(max_length = 81);    article = models.ManyToManyField(article,through='article_author',through_fields=(        'author','article'));    object = authorManager()    #display    def __unicode__(self):        return u'{} {}'.format(self.author_id,self.author_name)    class Meta:        ordering = ['author_id']class journalManager(models.Manager):    #select    def select_by_journal_name(self,journalName):        return super(journalManager,self).get_queryset().filter(journal_name__contains='ab')class journal(models.Model):    journal_id = models.AutoField(primary_key=True,auto_created=True)    journal_name = models.CharField(max_length = 81);    object = journalManager()    #display    def __unicode__(self):        return self.journal_name class article_author(models.Model):    article_author_id = models.AutoField(primary_key=True,auto_created=True)    article = models.ForeignKey(article)    author = models.ForeignKey(author)    serial_number = models.IntegerField();    #display    def __unicode__(self):        return u'{} {} {}'.format(self.article_id,self.author_id,self.serial_number)

其中包括外键,以及多对多的关系,在查询的过程中就得花心思!
因为下面要实现的功能,与查询息息相关

功能

这里写图片描述

恩,就是这个丑东西,主要是锻炼数据库sql查询,所以界面我也是才学啊…
搜索框旁边的all是搜索选项,可以选择按照author,article,year,journal等词条搜索,all就是随意…
不管什么搜索,都要显示下面是三个内容.主要是article内容端要包含journal和author的信息,所以这地方的查询对新手来说比较绕.

下面就是我实际在开发中遇到的问题.

在强调一遍,我用的版本是1.11,版本不一样,肯定api有差别的!!
https://www.douban.com/note/301166150/
https://www.douban.com/group/topic/27653472/

问题1:在django中的html引入外部文件,例如css,js,img等外部文件

问题答案参考网址,django1.11文档static设置
此配置仅适合于调试阶段,也就是使用django的runserver在django内部的服务器中运行,不涉及tomcat等外部服务器

  1. 确保配置文件中(setting.py)INSTALLED_APPS中包含django.contrib.staticfiles
  2. 在配置文件中(setting.py)中,添加STATIC_URL = ‘/static/’,其中/表示的就是根目录,如下图所示的我的文件目录表,服务器中是将外层paperManager作为/目录的,所以如果你的static不在图示的位置,只要将这个地址改一下就行了.
  3. 在html中引入外部文件(编辑器太…说不定是我不会用,看下面附件吧)
  4. 配置url,
  5. 在setting.py中添加STATICFILES_DIRS字段
###setting.py# Static files (CSS, JavaScript, Images)# https://docs.djangoproject.com/en/1.11/howto/static-files/STATICFILES_DIRS = [    os.path.join(BASE_DIR, "static"),    ]STATIC_URL = '/static/'###html{% load static %}<img src="{% static "picture/logo.png" %}" alt = "logo"/>###urlfrom django.contrib.staticfiles import viewsurlpatterns = [    url(r'^static/(?P<path>.*)',views.serve),]

问题2:django中与数据库相关的model层怎么建?包括onevsmany和manyvsmany

class journal(models.Model):    passclass article(models.Model):    journal = models.ForeignKey(journal,related_name="article")class author(models.Model):    article = models.ManyToManyField(article,through='article_author',through_fields=(        'author','article'),related_name="author");class article_author(models.Model):    article_author_id = models.AutoField(primary_key=True,auto_created=True)    article = models.ForeignKey(article)    author = models.ForeignKey(author)    serial_number = models.IntegerField();

四张表,其中最后一张表是中间表,因为有第三个字段,所以就需要重新建一个中间表.在外键和多对多关系的建立中,最好都添加一个related_name字段.比如journal和article之间有一个外键连接.其中外键设置在article类中,如果不设置related_name,那么当journal表需要通过外键反查article表时,命名就为article_set,如果设置了related_name,这里就会覆盖article_set的命名.关于如何通过外键反查,请看下面.

问题3:如果数据库的列发生变化,或者想增加数据库之类的怎么通过django model层实现?

django1.11 直接使用migrate管理工具,先修改django model层对应的字段,然后运行下面命令

python manage.py makemigrationspython manage.py migrate

问题4:如何通过article反查author的信息.

这个问题分成两个小问题
1.如何通过外键查询信息
2.如何通过中间表查询信息
https://stackoverflow.com/questions/12139923/all-the-values-of-the-many-to-many-field-django
https://stackoverflow.com/questions/11073454/django-prefetch-related-with-filter

问题5:如何修改

贴上我的文件目录,mvc架构一目了然,其中static目录是用来存放外部文件的

这里写图片描述

最后安利一波django自动生成的后台管理系统!!!

这里写图片描述

因为外键约束在增加article的时候,会弹出增加journal的弹出框,不能再赞!!!

这里写图片描述

关于这个如何将自己的model导入他自动生成的管理界面.可以参考菜鸟教程

原创粉丝点击