stark組件4_pop功能-創(chuàng)新互聯(lián)

pop功能模仿Django-Admin中添加頁面的pop功能

為汕城等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及汕城網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都做網(wǎng)站、網(wǎng)站建設(shè)、汕城網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!

stark組件4_pop功能

pop功能需要實現(xiàn)的功能和問題

1 如何在一對多和多對多字段后渲染 +
2 +對應(yīng)的跳轉(zhuǎn)路徑是什么
3 保存添加記錄同時,將原頁面的對應(yīng)的下拉菜單中添加該記錄

具體實現(xiàn)(只在添加頁面實現(xiàn)功能)

添加頁面代碼邏輯(包含pop功能):

此處請參考ModleForm相關(guān)內(nèi)容

def add(self, request):
    #ModelFormDemo等同于得到了DemoModelForm這個類
    ModelFormDemo = self.get_modelForm()
    #實例化出來一個form對象
    form = ModelFormDemo()

    #通過循環(huán)判斷沒有個字段類是否是判斷form對象是否是一對多或多對多,并做相應(yīng)處理
    for bfield in form:
        from django.forms.models import ModelChoiceField
        #ModelMultipleChoiceField繼承ModelChoiceField,因此一對多和多對多都是ModelChoiceField
        #如果當前對象是一對多或多對多
        if isinstance(bfield.field, ModelChoiceField):
            #添加一個屬性,用于在模板中判斷是否渲染頁面時加上加號
            bfield.is_pop = True
            # print("====>",bfield.field.queryset.model)
            # == == > < class 'app01.models.Publish'>
            # == == > < class 'app01.models.Author'>
            #獲取app名字和關(guān)聯(lián)表的名稱
            related_model_name = bfield.field.queryset.model._meta.model_name
            related_app_lable = bfield.field.queryset.model._meta.app_label
            #利用反向解析找到url
            _url = reverse("%s_%s_add" % (related_app_lable, related_model_name))
            # print(_url)
            # / stark / app01 / publish / add /
            # / stark / app01 / author / add /
            #構(gòu)建url值,這個值要傳給模板用
            bfield.url = _url+"?pop_res_id=id_%s" %bfield.name
            #bfield.url == > / stark / app01 / author / add /?pop_res_id = id_authors

    # 如果收到POST請求則修改數(shù)據(jù)
    # 這里有兩種情況,一種是通過pop添加數(shù)據(jù),此時url帶有pop_res_id,一種是在查看頁面點添加,url里是沒有pop_res_id的
    if request.method == "POST":
        #將request.POST放到form中進行校驗
        form = ModelFormDemo(request.POST)
        if form.is_valid():
            obj = form.save()
            # print("obj==>", obj)
            #obj==> Django 第二版
            # print("type==>", type(obj))
            #type==> <class 'app01.models.Book'>

            #獲?。╬op功能提交的post請求時)url中的pop_res_id值
            pop_res_id = request.GET.get("pop_res_id")
            #如果此處有值就將數(shù)據(jù)返回給pop.html頁面
            if pop_res_id:
                res = {"pk": obj.pk, "text": str(obj), "pop_res_id": pop_res_id}
                return render(request, "pop.html", {"res": res})

            else: #如果此次無值則直接跳轉(zhuǎn)到相應(yīng)頁面
                return redirect(self.get_list_url())
                # return redirect("/stark/app01/book/")

    return render(request, "add.html", locals())

添加頁面渲染(form.html)

<div class="container">
    <div class="row">
        <div class="col-md-6 col-md-offset-3">
            <form action="" method="post" novalidate>
                {% csrf_token %}
                {% for field in form %}
                    <div  class="form-group">
                        <label for="">{{ field.label }}</label>
                        {{ field }} <span class="error pull-right">{{ field.errors.0 }}</span>
                        <!-- 下面判斷field是否有is_pop屬性為True -->
                        <!-- 有的話就在輸入框后面添加一個加號,并綁定pop事件 -->
                        {% if field.is_pop %}
                            <a onclick="pop('{{ field.url }}')" ><span
                                    >+</span></a>
                        {% endif %}
                    </div>
                {% endfor %}
                <input type="submit" class="btn btn-default">
            </form>
        </div>
    </div>
</div>
<!-- 點擊加號就觸發(fā)pop函數(shù) -->
<script>
    function pop(url) {
        // 打開一個獨立的添加窗口
       window.open(url, "", "width=600,height=400,top=100,left=100")
    }
</script>

pop頁面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Title</title>
</head>
<body>

<script>
    // 觸發(fā)父頁面的pop_response函數(shù),并且把參數(shù)傳過去
   window.opener.pop_response('{{ res.pk }}', '{{ res.text }}', '{{ res.pop_res_id }}');
    // 之后立即關(guān)閉這個頁面
   window.close()
</script>

</body>
</html>

add頁面body示例代碼(是pop頁面的父頁面)

<body>

<h4>添加數(shù)據(jù)</h4>
{% include 'form.html' %}

<script>
    function pop_response(pk, text, id) {
        // 選擇哪個select標簽
        // option的文本值和value值

        // 生成一個空的option標簽
        var $option=$('<option>');
        // 往option標簽中添加內(nèi)容
        $option.html(text);
        $option.val(pk);
        $option.attr("selected", "selected");

        // 按id找位置,將標簽添加進去
        $("#"+id).append($option)
    }
</script>
</body>

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

本文標題:stark組件4_pop功能-創(chuàng)新互聯(lián)
本文鏈接:http://muchs.cn/article48/pgsep.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護、域名注冊、靜態(tài)網(wǎng)站、微信公眾號、網(wǎng)站改版、外貿(mào)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

手機網(wǎng)站建設(shè)