溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

django-總結(jié)

發(fā)布時間:2020-06-11 13:31:52 來源:網(wǎng)絡(luò) 閱讀:411 作者:lixiaobo994 欄目:開發(fā)技術(shù)

__author__ = '李曉波'


基礎(chǔ)

    常用命令

        django-admin startproject sitename 創(chuàng)建項目

        python manage.py runserver 0.0.0.0 啟動服務(wù)

        python manage.py startapp appname 創(chuàng)建app

        python manage.py makemigrations 檢索數(shù)據(jù)庫

        python manage.py migrate 創(chuàng)建數(shù)據(jù)庫

        python manage.py createsuperuser 創(chuàng)建超級用戶

    配置文件

    

        1、數(shù)據(jù)庫

            DATABASES = {

                'default': {

                'ENGINE': 'django.db.backends.mysql',

                'NAME':'dbname',

                'USER': 'root',

                'PASSWORD': 'xxx',

                'HOST': '',

                'PORT': '',

                }

            }

        

        模板

            TEMPLATE_DIRS = (

                    os.path.join(BASE_DIR,'templates'),

                )

        

        靜態(tài)文件

            STATICFILES_DIRS = (

                    os.path.join(BASE_DIR,'static'),

                )



視圖和url

每個視圖函數(shù)至少有一個request參數(shù)

    url

        Django中網(wǎng)址是寫在 urls.py 文件中,用正則表達(dá)式對應(yīng) views.py 中的一個函數(shù)

        配置url和對應(yīng)視圖函數(shù)之間的映射

        url(r'^index/(\d*)', views.index),

        url(r'^manage/(?P<name>\w*)/(?P<id>\d*)', views.manage),

        url(r'^manage/(?P<name>\w*)', views.manage,{'id':333}),

        

        url(r'^web/',include('web.urls')), 根據(jù)app對路由規(guī)則進(jìn)行一次分類



    模板

        用{{}}包圍的是變量,如`person_name`,

        用{%%}包圍的是塊標(biāo)簽,如{%if ordered_warranty%}

        {% for item in item_list %}  <a>` item `</a>  {% endfor %}

          forloop.counter

          forloop.first

          forloop.last 

        {% if ordered_warranty %}  {% else %} {% endif %}

        母板:{% block title %}{% endblock %}

        子板:{% extends "base.html" %}

           {% block title %}{% endblock %}

        

        {{ship_date|date:"F j, Y"}}把ship_date變量傳遞給過濾器,并給date過濾器傳遞了一個參數(shù)“F j, Y”,date過濾器以給定參數(shù)的形式格式化日期



模型

    新建對象:

        Person.objects.create(name=name,age=age)

        p = Person(name="WZ", age=23)

        p.save()

        p = Person(name="TWZ")

        p.age = 23

        p.save()

        Person.objects.get_or_create(name="WZT", age=23)

        這種方法是防止重復(fù)很好的方法,但是速度要相對慢些,返回一個元組,第一個為Person對象,第二個為True或False, 新建時返回的是True, 已經(jīng)存在時返回False.


    獲取對象:

        models.Tb1.objects.filter(name='seven').count() #獲取個數(shù)

        Person.objects.all()

        Person.objects.all()[:10] 切片操作,獲取10個人,不支持負(fù)索引,切片可以節(jié)約內(nèi)存

        Person.objects.get(name=name)

        Person.objects.filter(name="abc") # 等于Person.objects.filter(name__exact="abc") 名稱嚴(yán)格等于 "abc" 的人

        models.Tb1.objects.filter(id__gt=1)              # 獲取id大于1的值

        models.Tb1.objects.filter(id__lt=10)             # 獲取id小于10的值

        models.Tb1.objects.filter(id__lt=10, id__gt=1)   # 獲取id大于1 且 小于10的值

        models.Tb1.objects.filter(id__in=[11, 22, 33])   # 獲取id等于11、22、33的數(shù)據(jù)

        models.Tb1.objects.exclude(id__in=[11, 22, 33])  # not in

        models.Tb1.objects.filter(id__range=[1, 2])   # 范圍bettwen and

        Person.objects.filter(name__iexact="abc") # 名稱為 abc 但是不區(qū)分大小寫,可以找到 ABC, Abc, aBC,這些都符合條件

        Person.objects.filter(name__contains="abc") # 名稱中包含 "abc"的人

        Person.objects.filter(name__icontains="abc") #名稱中包含 "abc",且abc不區(qū)分大小寫

        Person.objects.exclude(name__contains="WZ") # 排除包含 WZ 的Person對象

        Person.objects.filter(name__contains="abc").exclude(age=23) # 找出名稱含有abc, 但是排除年齡是23歲的

        Person.objects.filter(name__regex="^abc") # 正則表達(dá)式查詢

        Person.objects.filter(name__iregex="^abc")# 正則表達(dá)式不區(qū)分大小寫


    刪除對象:

            Person.objects.filter().delete()

            Person.objects.all().delete()


    修改對象

        models.Tb1.objects.filter(name='seven').update(gender='0')  # 將指定條件的數(shù)據(jù)更新,均支持 **kwargs

        obj = models.Tb1.objects.get(id=1)#修改單條數(shù)據(jù)

        obj.c1 = '111'

        obj.save()                                                 



連表結(jié)構(gòu)

這個一對多、多對多一直困擾著我,自學(xué)的時候都沒搞明白,這次專門聽課,又不怎么太明白,閑著無聊就問女朋友,啥叫一對多

啥叫多對多,她很自然的說:一對多,就是一個打多個,多對多就是,兩幫人亂打。草泥馬,瞬間我明白了。

    一對多(外鍵)models.ForeignKey

    在django的模型中,可以簡單的理解為,一個表的外鍵的值是另一個表的主鍵。

    

        定義兩個模型,一個是書,一個是出版社,是一對多的類型。

        class Publisher(models.Model):

            name = models.CharField(max_length=30)

            address = models.CharField(max_length=50)

            website = models.URLField()

            def __unicode__(self):

                return self.name

        

        class Book(models.Model):

            title = models.CharField(max_length=100)

            authors = models.ManyToManyField(Author)

            publisher = models.ForeignKey(Publisher)

            publication_date = models.DateField()

            def __unicode__(self):

                return self.title

    

        查詢書籍的出版商是誰,

        p = Book.objects.get(查詢條件)

        p.publisher

        

        如果我們要查詢一個出版商出版了哪些書籍的話,那我們要怎么做呢?

        先查詢到出版商的信息

        p = Publisher.objects.get(查詢條件)

        p.book_set.filter(過濾條件)


    多對多 models.Many-to-Many

    定義兩個模型,一個是書,一個是作者,是多對多的類型。

        class Author(models.Model):

            first_name = models.CharField(max_length=30)

            last_name = models.CharField(max_length=40)

            email = models.EmailField()

            def __unicode__(self):

                return u'%s %s' % (self.first_name, self.last_name)

        

        class Book(models.Model):

            title = models.CharField(max_length=100)

            authors = models.ManyToManyField(Author)

            publisher = models.ForeignKey(Publisher)

            publication_date = models.DateField()

            def __unicode__(self):

                return self.title


        查詢書籍的作者有誰

        b = Book.objects.get(查詢條件)

        b.authors.all()

        

        如果我們要查詢一個作者出版了哪些書籍的話,那我們要怎么做呢?

        先查詢到出作者的信息

        a = Author.objects.get(查詢條件)

        a.book_set.filter(過濾條件)




表單

    表單可以驗證輸入,也可以生成html

    <form action="/user_list/" method="post">

        <p>用戶類型:` obj`.`user_type `

            <span>{% error_message errors.user_type %}</span>

        </p>

        <p>主機:` obj`.`host `

            <span>{% error_message errors.host %}</span>

        </p>

        <p>端口:` obj`.`port ` <span>` errors`.`port `</span></p>

        <p>郵箱:` obj`.`email ` <span>` errors`.`email `</span></p>

        <p>手機:` obj`.`mobile ` <span>` errors`.`mobile `</span></p>

        <p>備注:` obj`.`memo ` <span>` errors`.`memo `</span></p>

        <input type="submit"  value="submit" />

    </form>



    #z自定義匹配類型

        def mobile_validate(value):

            mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$')

            if not mobile_re.match(value):

                raise ValidationError('手機號碼格式錯誤')


    #創(chuàng)建一個繼承Form的類

    class UserInfo(forms.Form):

        user_type_choice = (

            (0, u'普通用戶'),

            (1, u'高級用戶'),

        )

        

        user_type = forms.IntegerField(widget=forms.widgets.Select(choices=user_type_choice,

                                                                   attrs={'class': "form-control"}))

        email = forms.EmailField(error_messages={'required': u'郵箱不能為空'}) #自定義表單錯誤提示

        host = forms.CharField(error_messages={'required': u'主機不能為空'})

        port = forms.CharField(error_messages={'required': u'端口不能為空'})

        mobile = forms.CharField(validators=[mobile_validate, ],  #調(diào)用自己定義的匹配函數(shù)

                                 error_messages={'required': u'手機不能為空'},

                                 widget=forms.TextInput(attrs={'class': "form-control", #添加標(biāo)簽屬性

                                                              'placeholder': u'手機號碼'}))

        memo = forms.CharField(required=False,

                               widget=forms.Textarea(attrs={'class': "form-control",

                                                            'placeholder': u'備注'})

                               )


    #前端提交數(shù)據(jù)處理函數(shù)

    def user_list(request):

        obj = UserInfo()

        if request.method == "POST":

            user_input_obj = UserInfo(request.POST)

            if user_input_obj.is_valid():

                data = user_input_obj.clean()

                print data

            else:

                error_msg = user_input_obj.errors.as_data()

                return render(request, 'user_list.html', {'obj': user_input_obj, 'errors': error_msg})

        return render(request, 'user_list.html', {'obj': obj})





ajax


    1、ajax提交提交單條數(shù)據(jù)到django

        function AjaxSubmit(){

            var host = "1.1.1.1";

            var port = "9999";

            $.ajax({

                url: "/ajax_data/",

                type: 'POST',

                data: {h:host, p:port},

                success: function(arg){

                }

            });

        }

    django接收數(shù)據(jù)

        def ajax_data(request):

            print request.POST['h']

            return HttpResponse('ok')


    2、ajax提交包含多條數(shù)據(jù)的元祖

        function AjaxSubmitSet(){

            var array_users= [

                {'username': 'alex', 'age': 18},

                {'username': 'rain', 'age': 16},

                {'username': 'eric', 'age': 17}

            ];

            $.ajax({

                url: "/ajax_data_set/",

                type: 'POST',

                tradition: true,

                data: {data: JSON.stringify(array_users)},

                success: function(arg){

                    // json.loads

                    var callback_dict = $.parseJSON(arg);

                    if(callback_dict.status){

                        alert('成功');

                    }else{

                        alert(callback_dict.error);

                    }

                }

            });

        }


    django接受數(shù)據(jù)

        def ajax_data_set(request):

            ret = {'status': True, 'error':""}

            try:

                print request.POST

            except Exception,e:

                ret['status'] = False

                ret['error'] = str(e)

        

            return HttpResponse(json.dumps(ret))



session

    request.session 可以在視圖中任何地方使用,它類似于python中的字典

    session 默認(rèn)有效時間為兩周,可以在 settings.py 中修改默認(rèn)值

    # 創(chuàng)建或修改 session:

    request.session[key] = value

    # 獲取 session:

    request.session.get(key,default=None)

    # 刪除 session

    del request.session[key] # 不存在時報錯


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI