您好,登錄后才能下訂單哦!
pop功能模仿Django-Admin中添加頁面的pop功能
1 如何在一對多和多對多字段后渲染 +
2 +對應的跳轉(zhuǎn)路徑是什么
3 保存添加記錄同時,將原頁面的對應的下拉菜單中添加該記錄
此處請參考ModleForm相關內(nèi)容
def add(self, request):
#ModelFormDemo等同于得到了DemoModelForm這個類
ModelFormDemo = self.get_modelForm()
#實例化出來一個form對象
form = ModelFormDemo()
#通過循環(huán)判斷沒有個字段類是否是判斷form對象是否是一對多或多對多,并做相應處理
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名字和關聯(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)到相應頁面
return redirect(self.get_list_url())
# return redirect("/stark/app01/book/")
return render(request, "add.html", locals())
<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>
<!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 }}');
// 之后立即關閉這個頁面
window.close()
</script>
</body>
</html>
<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>
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。