stark组件4_pop功能
admin
2023-07-21 04:41:47
0

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

stark组件4_pop功能

pop功能需要实现的功能和问题

1 如何在一对多和多对多字段后渲染 +
2 +对应的跳转路径是什么
3 保存添加记录同时,将原页面的对应的下拉菜单中添加该记录

具体实现(只在添加页面实现功能)

添加页面代码逻辑(包含pop功能):

此处请参考ModleForm相关内容

def add(self, request):
    #ModelFormDemo等同于得到了DemoModelForm这个类
    ModelFormDemo = self.get_modelForm()
    #实例化出来一个form对象
    form = ModelFormDemo()

    #通过循环判断没有个字段类是否是判断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名字和关联表的名称
            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 /
            #构建url值,这个值要传给模板用
            bfield.url = _url+"?pop_res_id=id_%s" %bfield.name
            #bfield.url == > / stark / app01 / author / add /?pop_res_id = id_authors

    # 如果收到POST请求则修改数据
    # 这里有两种情况,一种是通过pop添加数据,此时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==> 

            #获取(pop功能提交的post请求时)url中的pop_res_id值
            pop_res_id = request.GET.get("pop_res_id")
            #如果此处有值就将数据返回给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: #如果此次无值则直接跳转到相应页面
                return redirect(self.get_list_url())
                # return redirect("/stark/app01/book/")

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

添加页面渲染(form.html)

{% csrf_token %} {% for field in form %}
{{ field }} {{ field.errors.0 }} {% if field.is_pop %} + {% endif %}
{% endfor %}

pop页面




    
    
    
    Title






add页面body示例代码(是pop页面的父页面)



添加数据

{% include 'form.html' %}

相关内容

热门资讯

意大利总理回击特朗普批评:应关... △意大利总理梅洛尼(资料图)意大利总理梅洛尼20日就美国总统特朗普针对其政府的最新批评作出回应,称特...
以总理及防长被曝已命令以军在黎... 据以色列方面20日消息,以色列总理内塔尼亚胡和国防部长卡茨已下达指令,要求以军在黎巴嫩停火。根据该指...
梁文杰称台湾人几乎不吃凤梨释迦... 海峡导报综合报道 台陆委会副主委梁文杰18日称凤梨释迦“台湾人几乎不吃,是仰大陆鼻息的农产品”,引起...
伊朗谈判代表已启程前往瑞士 据伊朗方面20日消息,伊朗谈判代表已启程前往瑞士,就谅解备忘录与美方进行讨论。6月20日,巴基斯坦外...
美军称暂未观察到伊朗关闭霍尔木... 新华社华盛顿6月20日电 据美国媒体20日援引美国高级官员的话报道称,美军暂未观察到伊朗关闭霍尔木兹...
万亿市场,“爆发前夜” 就在SpaceX6月12日完成纳斯达克首秀前,创始人埃隆·马斯克在一场访谈上确认,SpaceX正在开...
乌俄互指对方在赫尔松州发动袭击 乌克兰赫尔松州军事管理局20日在社交媒体发文称,截至当天早上6时,赫尔松州乌控区在过去24小时内遭俄...
伊朗外长将与巴基斯坦内政部长一... 当地时间20日,有消息显示,伊朗外长阿拉格齐20日晚将与巴基斯坦内政部长纳克维一同前往瑞士。伊朗外交...
文博日历丨早在8000年前 古... 端午假期各地特色龙舟活动轮番亮相其实,早在8000年前先民们就已经是有船一族了今天带你一起解锁“远古...
凤凰晚报丨35岁宝妈亲手勒死3... 今日人物【35岁宝妈亲手勒死3个娃,丈夫:不怪她】最近,美国马萨诸塞州一起震惊全美的“杀婴案”再次开...