最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 如何快速搭建Django项目

    正文概述    2020-03-22   275

    如何快速搭建Django项目

    一、创建一个Django项目

    1、使用虚拟环境

    #快速创建虚拟环境
    python -m venv prjvenv
    #激活虚拟环境
    source prjvenv/bin/activate

    2、创建项目

    #安装django
    pip install django
    #创建项目
    django-admin startproject myblog

    3、django设置

    myblog/settings.py文件

    TIME_ZONE='Asia/Shanghai'

    4、数据库迁移

    python manage.py migrate

    5、启动

    python manage.py runserver

    二、视图和URL配置

    myblog/views.py文件

    from django.http import HttpResponse
    #最简单视图
    def hello(request):
        return HttpResponse("Hello world")
    #带参数的视图
    def hours_ahead(request, offset):
           try:
               offset = int(offset)
           except ValueError:
               raise Http404()
           dt = datetime.datetime.now() + datetime.timedelta(hours=offset)
           html = "In %s hour(s), it will be  %s." % (offset, dt)
           return HttpResponse(html)

    myblog/urls.py 文件

    from django.conf.urls import url
    from django.contrib import admin
    from myblog.views import hello
    from mysite.views import hours_ahead
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^hello/$',hello),
        url(r'^time/plus/(\d{1,2})/$', hours_ahead),
     ]

    三、使用Django模板

    1、模板目录配置

    myblog/settings.py文件

    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': ['app1/templates','app2/templates'...],
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    'django.template.context_processors.debug',
                    'django.template.context_processors.request',
                    'django.contrib.auth.context_processors.auth',
                    'django.contrib.messages.context_processors.messages',
                ],
            },
        },
    ]
    如果想在项目根目录中放一些主模板(例如在 mysite/templates 目录中),需要像这样设定 DIRS:
    'DIRS': [os.path.join(BASE_DIR, 'templates')],

    2、视图函数

    from django.shortcuts import render
    import datetime
    def current_datetime(request):
        now = datetime.datetime.now()
        return render(request, 'current_datetime.html', {'current_date': now})

    3、模板文件

    myblog/templates/base.html文件

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
    <html>
    <head>
        <title>{% block title %}{% endblock %}</title>
    </head>
    <body>
        <h1>My helpful timestamp site</h1>
        {% block content %}{% endblock %}
        {% block footer %}<hr>
        <p>Thanks for visiting my site.</p>
        {% endblock %}
    </body>
    </html>

    四、模型

    1、配置数据库

    myblog/setting.py

    DATABASES = {
        'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    } }

    2、创建应用

    python manage.py startapp books

    3、激活应用

     INSTALLED_APPS = (
            ...
            'books',
    )

    4、创建模型

    myblogs/books/models.py

    from django.db import models
    class Publisher(models.Model):
        name = models.CharField(max_length=30)
        address = models.CharField(max_length=50)
        city = models.CharField(max_length=60)
        state_province = models.CharField(max_length=30)
        country = models.CharField(max_length=50)
        website = models.URLField()
        def __str__(self):
            return self.name
    class Author(models.Model):
        first_name = models.CharField(max_length=30)
        last_name = models.CharField(max_length=40)
        email = models.EmailField()
        def __str__(self):
            return self.last_name
    class Book(models.Model):
        title = models.CharField(max_length=100)
        authors = models.ManyToManyField(Author)
        publisher = models.ForeignKey(Publisher,on_delete=models.CASCADE)
        publication_date = models.DateField()
        def __str__(self):
            return self.title

    5、迁移数据库

    #括号中的内容可以不需要
    python manage.py makemigrations (books)
    python manage.py migrate

    6、操作数据

    新增数据

    方式一:
    p1 = Publisher(...)
    p1.save()
    方式二:
    p1 = Publisher.objects.create(...)

    更新数据

    方式一:
    p.name = 'Apress Publishing'
    p.save()
    方式二:
    Publisher.objects.filter(id=52).update(name='Apress')   #推荐

    查询数据

    返回查询集合

    Publisher.objects.all()
    Publisher.objects.filter(name='Apress')    #WHERE name = 'Apress';
    Publisher.objects.filter(name__contains="press")     #WHERE name LIKE '%press%';

    返回单个对象

    Publisher.objects.get(name="Apress")   #不是1个对象就会报异常
    try:
        p = Publisher.objects.get(name='Apress')  #数据库中存在一个数据
    except Publisher.DoesNotExist:
        print ("Apress isn't in the database yet.")   #数据库中没有数据
    else:
        print ("Apress is in the database.")    #有多个数据

    删除

    方式一:单个删除
    p = Publisher.objects.get(name="O'Reilly")
    p.delete()
    方式二:批量删除
    Publisher.objects.filter(country='USA').delete()
    Publisher.objects.all().delete()

    排序

    方式一:使用order_by()
    Publisher.objects.order_by("name", "age")   #根据姓名和年龄排序,-name/-age实现反向排序
    方式二:在模型内定义
    class Publisher(models.Model):
        ...
        class Meta:
            ordering = ['name']

    切片

    Publisher.objects.order_by('name')[0:2]

    五、后台管理

    1、创建管理员用户

    python manage.py createsuperuser

    2、将模型添加到后台管理

    myblog/books/admin.py文件

    from django.contrib import admin
    from .models import Publisher, Author, Book
    admin.site.register(Publisher)
    admin.site.register(Author)
    admin.site.register(Book)

    3、修改模型,使字段在后台输入时变为可选项

    myblog/books/models.py

    class Book(models.Model):
        title = models.CharField(max_length=100)
        authors = models.ManyToManyField(Author)
        publisher = models.ForeignKey(Publisher,on_delete=models.CASCADE)
        publication_date = models.DateField(blank=True, null=True)

    注意:如果想让日期字段(如 DateField、TimeField、DateTimeField)或数值字段(如 IntegerField、DecimalField、FloatField)接受空值,要同时添加 null=True 和 blank=True。

    4、通过模型字段的verbose_name值指定后台显示的字段别名

    myblog/books/models.py

    class Author(models.Model):
        first_name = models.CharField(max_length=30)
        last_name = models.CharField(max_length=40)
        email = models.EmailField(blank=True, verbose_name='e-mail')

    5、自定义修改后台管理列表

    myblog/books/admin.py文件

    from django.contrib import admin
    from .models import Publisher, Author, Book
    #自定义Author的后台管理列表
    class AuthorAdmin(admin.ModelAdmin):
            list_display = ('first_name', 'last_name', 'email')  #定义显示字段
            search_fields = ('first_name', 'last_name')    #添加字段搜索
    #自定义Book的后台管理列表
    class BookAdmin(admin.ModelAdmin):
            list_display = ('title', 'publisher', 'publication_date')    #定义显示字段
            list_filter = ('publication_date',)    #添加时间过滤器
            date_hierarchy = 'publication_date'    #另一种日期过滤器
            ordering = ('-publication_date',)      #排序
            fields = ('title', 'authors', 'publisher', 'publication_date') #自定义修改表单
            filter_horizontal = ('authors',)       #使用选项框(多对多关系时使用)
            raw_id_fields = ('publisher',)         #通过id选择对应选项
    admin.site.register(Publisher)
    admin.site.register(Author,AuthorAdmin)
    admin.site.register(Book,BookAdmin)

    六、表单

    (1)原生表单

    1、获取request数据应该try或者设置默认值,防止报错

    方式一:

    def ua_display_good1(request):
        try:
            ua = request.META['HTTP_USER_AGENT']
        except KeyError:
            ua = 'unknown'
        return HttpResponse("Your browser is %s" % ua)

    方式二:

    def ua_display_good2(request):
        ua = request.META.get('HTTP_USER_AGENT', 'unknown')
        return HttpResponse("Your browser is %s" % ua)

    2、简单的表单提交及表单实例

    get和post指向相同的url,根据 if ‘q’ in request.GET:判断是GET还是POST

    模板页面

    #表单页面:myblog/templates/search_form.html
    <html>
    <head>
        <title>Search</title>
    </head>
    <body>
        {% if errors %}   #提示错误信息
        <ul>
            {% for error in errors %}
            <li>{{ error }}</li>
            {% endfor %}
        </ul>
        {% endif %}
        <form action="" method="get">  #action为空,表示提交到当前页面
            <input type="text" name="q">
            <input type="submit" value="Search">
        </form>
    </body>
    </html>
    #结果展示页面:myblog/templates/search_results.html
    <html>
    <head>
        <title>Book Search</title>
    </head>
    <body>
        <p>You searched for: <strong>{{ query }}</strong></p>
        {% if books %}
        <p>Found {{ books|length }} book{{ books|pluralize }}.</p>
        <ul>
            {% for book in books %}
            <li>{{ book.title }}</li>
            {% endfor %}
        </ul>
        {% else %}
        <p>No books matched your search criteria.</p>
        {% endif %}
    </body>
    </html>

    视图函数:myblog/books/views.py文件

    from django.shortcuts import render
    from django.http import HttpResponse
    def search(request):
        errors = []
        if 'q' in request.GET: # 如果是post,则存在GET['q']
            q = request.GET['q']
            if not q:
                errors.append('Enter a search term.')  # 提交了表单,但是内容为空
            elif len(q) > 20:  # 提交表单,长度超过限制
                errors.append('Please enter at most 20 characters.')
            else:   # 正常提交数据
                books = Book.objects.filter(title__icontains=q)
                return render(request, 'search_results.html',
                    {'books': books, 'query': q})
        return render(request, 'search_form.html',{'errors': errors})  #不存在GET['q']说明是GET请求

    路由:myblog/urls.py文件

    urlpatterns = [
        ...
        url(r'^search/$',views.search)
    ]

    (2)Django表单模型

    1、定义表单类

    myblog/books/forms.py

    from django import forms
    class ContactForm(forms.Form):
        subject = forms.CharField(max_length=100)  # max_length指定最大长度
        email = forms.EmailField(required=False)
        message = forms.CharField(widget=forms.Textarea) # widget参数,指定表现逻辑,此次指定为文本框
        def clean_message(self):    # 自定义验表单证器
            message = self.cleaned_data['message']
            num_words = len(message.split())
            if num_words < 4:
                raise forms.ValidationError("Not enough words!")
            return message

    自定义表单验证器:Django 的表单系统会自动查找名称以 clean_ 开头、以字段名结尾的方法。如果存在这样的方法,在验证过 程中调用。这里,clean_message() 方法会在指定字段的默认验证逻辑(这个 CharField 是必填的)执行完毕后调用。

    2、视图函数

    myblog/books/views.py

    from books.forms import ContactForm
    def contact(request):
        if request.method == 'POST':
            form = ContactForm(request.POST)
            if form.is_valid():
                cd = form.cleaned_data
                #提示:如果没有配置邮件服务器,调用 send_mail() 时会抛出 ConnectionRefusedError。
                send_mail(
                    cd['subject'],
                    cd['message'],
                    cd.get('email', 'noreply@example.com'),
                    ['siteowner@example.com'],
                    )
                return HttpResponseRedirect('/contact/thanks/')
        else:
            form = ContactForm(
            initial={'subject': 'I love your site!'}  # 可以初始值
            )
        return render(request, 'contact_form.html', {'form': form})

    3、表单页面

    myblogs/templates/contact_form.html

    方式一:使用系统默认表单

     <html>
     <head>
        <title>Contact us</title>
    </head>
    <body>
        <h1>Contact us</h1>
        {% if form.errors %}
        <p style="color: red;">
            Please correct the error{{ form.errors|pluralize }} below.
        </p>
        {% endif %}
        <form action="" method="post">
        {% csrf_token %}
            <table>
                {{ form.as_table }}
            </table>
            {% csrf_token %}
            <input type="submit" value="Submit">
        </form>
    </body>
    </html>

    方式二:自定义表单外观样式

    <html>
    <head>
    <title>Contact us</title>
    </head>
    <body>
        <h1>Contact us</h1>
        {% if form.errors %}
        <p style="color: red;">
            Please correct the error{{ form.errors|pluralize }} below.
        </p>
        {% endif %}
        <form action="" method="post">
            <div>
                {{ form.subject.errors }}
                <label for="id_subject">Subject:</label>
                {{ form.subject }}
            </div>
            <div>
                {{ form.email.errors }}
                <label for="id_email">e-mail:</label>
                {{ form.email }}
            </div>
            <div>
                {{ form.message.errors }}
                <label for="id_message">Message:</label>
                {{ form.message }}
            </div>
            {% csrf_token %}
            <input type="submit" value="Submit">
        </form>
    </body>
    </html>

    4、路由设置

    myblogs/myblogs/urls.py

    urlpatterns = [
        ...
        url(r'^contact/$', views.contact),
    ]

    众多python培训视频,尽在python学习网,欢迎在线学习!

    本文转自:https://blog.csdn.net/weixin_38748717/article/details/79191318


    起源地下载网 » 如何快速搭建Django项目

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元