Django--其他常用功能之保留原页面所有内容

本文介绍Django中如何在不同页面间传递参数,包括GET请求的使用及QueryDict对象的操作,确保用户在提交数据后能返回原页面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

博客核心内容:


1、Django–其他常用功能之保留原页面所有内容
2、简单版本


如何带着参数过去
如何将参数带回


代码示例:
部分1:

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    # 我们工作中所说的Api其实指的就是url链接路由:http://127.0.0.1:8000/asset.html
    # 对于api我们既可以发送post请求,也可以发送get请求.
    url(r'^asset.html$', views.asset),
    url(r'^host_list.html$', views.host_list),
    url(r'^add_host.html$', views.add_host),
]

部分2:

from django.shortcuts import render,HttpResponse,redirect
from django.views.decorators.csrf import csrf_exempt,csrf_protect
# Create your views here.


#通过装饰器避免了csrf_token攻击
@csrf_exempt
def asset(request):
    """
    我们通常情况下提交数据一般有两种方式:Ajax和Form表单的方式
    """
    if request.method == 'GET':
        return HttpResponse('GET 收到...')
    else:
        print(request.POST)
        # print(request.body)
        """
        <QueryDict: {'salary': ['2000'], 
                     'username': ['Angela'], 
                     'password': ['123456']}
        >
        <QueryDict: {'name': ['zhangming'], 
                     'page': ['10']}
        >
        注意:如果request.post里面没有值,我们就到request.body里面去拿
        b'{"password": "123456", "username": "Angela", "salary": 2000}'
        """
        return HttpResponse('POST 收到...')


from django.http.request import QueryDict

def host_list(request):
    print(request.GET,type(request.GET))
    """
    <class 'django.http.request.QueryDict'>
    """
    print(request.GET.urlencode())
    """
    <QueryDict: {'page': ['10'], 'name': ['zhangming']}>
    page=10&name=zhangming
    通过request.GET.urlencode()可以将具体参数值的信息获取到
    但是我们一般不用现成的,而是重新赋予一个变量
    This QueryDict instance is immutable:默认QueryDict()对象是不可以被修改的
    """
    obj = QueryDict(mutable=True)
    obj['_canshu'] = request.GET.urlencode()
    print(obj['_canshu'])
    url_params = obj.urlencode()
    print(url_params)  #_canshu=name%3Dzhangming%26page%3D10
    """
    page=10&name=zhangming
    url_params=page%3D10%26name%3Dzhangming
    %3D为=   %26为&
    此时params将作为一个变量等于后面的值
    """
    hosts = ['c1.com','c2.com','c3.com']
    return render(request,'host_list.html',{'hosts':hosts,'url_params':url_params})


def add_host(request):
    """
    接下来我们就要想着如何返回原来的页面
    """
    print(request.GET)
    """
    <QueryDict: {'_canshu': ['name=zhangming&page=10']}>
    """
    if request.method == 'GET':
        return render(request,'add_host.html')
    else:
        print('------')
        print(request.POST)
        """
        <QueryDict: {'csrfmiddlewaretoken': ['FmhpzJaCnoJhn2pxzAG70fBsescpBmFenNjS3Vtofm3hvXhfXXDnujIF25j7xuSg'], 'hostname': ['']}>
        """
        url_params = request.GET.get('_canshu')
        print('参数是》》》》')
        print(url_params)
        hostname = request.POST.get('hostname')
        print(hostname)
        url = "/host_list.html?"+url_params
        return redirect(url)

部分3:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
     {# 注意:这里不能写action,这样的话才话向当前的url进行提交 #}
     <form method="POST">
         {% csrf_token %}
         <input type="text" name="hostname">
         <input type="submit" value="提交">
     </form>
</body>
</html>

部分4:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    {# a标签默认就是get请求 #}
    {# GET http://127.0.0.1:8000/add_host.html   #}
    {# 这样我们发送数据的时候就会带着参数去发送相应的数据 #}
    <a href="/add_host.html?{{ url_params }}">添加</a>
    <ul>
        {% for item in hosts %}
            <li>{{ item }}</li>
        {% endfor %}
    </ul>
</body>
</html>

效果展示:
这里写图片描述

简单版本

切记:Form表单出不要写action,这样才会向页面的当前链接进行提交.
通过url_params = request.GET.get(‘_canshu’)可以获取get中的参数值


代码示例:

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^host_list.html$', views.host_list),
    url(r'^add_host.html$', views.add_host),
]
from django.shortcuts import render,HttpResponse,redirect
from django.http.request  import  QueryDict


def host_list(request):
    obj = QueryDict(mutable=True)
    obj['_canshu'] = request.GET.urlencode()
    url_params = obj.urlencode()
    print(url_params)
    """
    _canshu=name%3Dzhangming%26page%3D10
    """
    hosts = ['host1','host2','host3']
    return render(request,'host_list.html',{'hosts':hosts,'url_params':url_params})

def add_host(request):
    if request.method == "GET":
        return render(request,'add_host.html')
    else:
        url_params = request.GET.get('_canshu')
        print(url_params)
        url = '/host_list.html?'+url_params
        return redirect(url)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form method="post">
        {% csrf_token %}
        <input type="text" name="hostname">
        <input type="submit" value="提交">
    </form>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <a href="/add_host.html?{{ url_params }}">添加主机</a>
    <ul>
        {% for host in hosts %}
            <li>host</li>
        {% endfor %}
    </ul>
</body>
</html>
<think>我们正在处理一个关于将现有Django项目迁移到Django-CMS的查询。根据引用内容,我们有一些关于Django迁移和Django-CMS的信息片段。引用[1]提到了一些Django-CMS插件,如'djangocms_link','djangocms_file'等,并指出'djangocms_googlemap'无法通过migrate命令删除,以及删除了其他一些插件。这提示我们在迁移到Django-CMS时可能会遇到插件相关的问题。引用[2]提供了关于Django数据库迁移的详细指南,包括迁移命令、问题排查、清理迁移文件等。这对于迁移过程中的数据库处理非常有帮助。引用[3]列出了一些Django学习资源,包括DjangoGirls教程、探戈与Django等,虽然不直接相关,但可能包含有用的背景知识。引用[4]提到了一些前端实现细节(Bootstrap和JavaScript),但与本问题关系不大。用户需求:将现有的Django项目迁移到Django-CMS。步骤概述:1.理解Django-CMS:它是一个内容管理系统,构建在Django之上,提供页面树、占位符、插件等特性。2.迁移准备:现有项目需要调整设置、模型、视图等以集成Django-CMS。3.具体步骤:a.安装Django-CMS及其依赖。b.配置设置文件(settings.py):添加Django-CMS相关应用、中间件、上下文处理器等。c.调整URL配置。d.数据库迁移:运行迁移命令以创建Django-CMS所需的表。e.现有模型与Django-CMS的集成:可能需要将现有内容映射到Django-CMS的页面或插件中。根据引用[1],我们需要注意Django-CMS插件的安装和迁移问题。详细步骤:步骤1:安装Django-CMS使用pip安装:```pipinstalldjango-cms```同时安装一些常用插件(可选):```pipinstalldjangocms-text-ckeditorpipinstalldjangocms-linkdjangocms-filedjangocms-picturedjangocms-videodjangocms-googlemapdjangocms-snippetdjangocms-styledjangocms-column```步骤2:配置settings.py添加必要的应用:```pythonINSTALLED_APPS=(#...'cms','menus','treebeard','sekizai',#...其他应用...#可选插件'djangocms_text_ckeditor','djangocms_link','djangocms_file','djangocms_picture','djangocms_video','djangocms_googlemap','djangocms_snippet','djangocms_style','djangocms_column',#...)```添加中间件:```pythonMIDDLEWARE=(#...'cms.middleware.user.CurrentUserMiddleware','cms.middleware.page.CurrentPageMiddleware','cms.middleware.toolbar.ToolbarMiddleware','cms.middleware.language.LanguageCookieMiddleware',#...)```添加上下文处理器:```pythonTEMPLATES=[{#...'OPTIONS':{'context_processors':[#...'sekizai.context_processors.sekizai','cms.context_processors.cms_settings',#...],},},]```设置语言和时区(确保正确):```pythonLANGUAGE_CODE='en'TIME_ZONE='UTC'USE_I18N=TrueUSE_L10N=TrueUSE_TZ=True#Django-CMS多语言支持LANGUAGES=[('en','English'),#其他语言...]```配置模板:需要为Django-CMS设置模板。通常,在项目的模板目录中创建基础模板,并在其中包含`{%loadcms_tags%}`和占位符。配置数据库:确保数据库设置正确(引用[2]中关于数据库迁移的内容可能有用)。步骤3:调整URL配置在项目的urls.py中,需要包含Django-CMS的URL:```pythonfromdjango.urlsimportinclude,pathfromdjango.conf.urls.i18nimporti18n_patternsfromdjango.contribimportadminurlpatterns=[path('admin/',admin.site.urls),]urlpatterns+=i18n_patterns(path('',include('cms.urls')),)```步骤4:运行迁移运行以下命令创建数据库表:```pythonmanage.pymigrate```注意:如果遇到迁移问题(如引用[1]中提到的'djangocms_googlemap'问题),可能需要单独处理。引用[2]提供了迁移问题排查的方法,如使用`showmigrations`检查迁移状态,使用`sqlmigrate`查看SQL语句等。步骤5:创建管理员用户并启动服务器```pythonmanage.pycreatesuperuserpythonmanage.pyrunserver```步骤6:集成现有应用将现有应用集成到Django-CMS中,通常有两种方式:-方式一:将现有应用作为Django-CMS的“应用钩子”(apphook),这样现有应用的视图可以挂载到CMS的页面下。-方式二:将现有内容通过插件嵌入到CMS页面中。应用钩子示例:1.在现有应用中创建`cms_app.py`文件。2.定义应用钩子:```pythonfromcms.app_baseimportCMSAppfromcms.apphook_poolimportapphook_poolfromdjango.urlsimportpathfrom.importviews@apphook_pool.registerclassMyApphook(CMSApp):app_name="myapp"name="MyApp"defget_urls(self,page=None,language=None,**kwargs):return[path('',views.index,name='index'),#...其他URL...]```3.在CMS页面高级设置中,选择该应用钩子。通过插件嵌入:可以创建自定义插件来显示现有模型的内容。这需要编写插件代码。注意事项:-现有项目的静态文件和模板可能需要调整,以适应Django-CMS的结构。-如果现有项目有自定义用户模型,确保与Django-CMS兼容。-备份数据库和代码,以防迁移过程中出现问题。引用[2]中提到的迁移问题排查方法在遇到数据库迁移错误时非常有用。例如,如果迁移失败,可以:-使用`pythonmanage.pyshowmigrations`查看迁移状态。-使用`pythonmanage.pysqlmigrate<app><migration>`查看迁移将执行的SQL语句。-如果迁移文件混乱,可以清理迁移文件(删除migrations文件夹中除__init__.py外的所有文件,然后重新运行makemigrations和migrate,但需谨慎操作)。总结:将现有Django项目迁移到Django-CMS需要安装Django-CMS、配置设置、调整URL、运行迁移,然后通过应用钩子或插件集成现有应用。根据要求,生成相关问题:1.在集成Django-CMS时,如何处理现有应用的自定义模型?2.如何为Django-CMS创建自定义插件?3.迁移到Django-CMS后,如何管理多语言内容?4.在迁移过程中遇到数据库迁移错误,应如何排查?</think>### 将现有 Django 项目迁移到 Django-CMS 指南 #### **核心步骤** 1. **安装依赖** 在虚拟环境中安装 Django-CMS 及其核心插件: ```bash pip install django-cms pip install djangocms-text-ckeditor djangocms-link djangocms-file djangocms-picture # 注意:djangocms-googlemap 需特殊处理(引用[1]) ``` 2. **配置 `settings.py`** ```python INSTALLED_APPS = [ # 有应用... 'cms', 'menus', 'treebeard', 'sekizai', # 静态占位符支持 # 添加插件 'djangocms_text_ckeditor', 'djangocms_link', 'djangocms_file', 'djangocms_picture', # 移除冲突应用(引用[1]) ] MIDDLEWARE = [ # ... 'cms.middleware.user.CurrentUserMiddleware', 'cms.middleware.page.CurrentPageMiddleware', 'cms.middleware.toolbar.ToolbarMiddleware', ] TEMPLATES = [ { 'OPTIONS': { 'context_processors': [ 'sekizai.context_processors.sekizai', # 必须添加 'cms.context_processors.cms_settings', ], }, }, ] CMS_TEMPLATES = [('home.html', '首页模板')] # 定义CMS模板 ``` 3. **数据库迁移** 运行迁移命令创建 CMS 表结构: ```bash python manage.py migrate ``` > **注意**:若遇到 `djangocms_googlemap` 等插件迁移失败(引用[1]),需手动清理迁移文件或从 `INSTALLED_APPS` 移除冲突应用。 4. **URL 配置** 修改 `urls.py` 集成 CMS 路由: ```python from django.urls import include, path from django.conf.urls.i18n import i18n_patterns urlpatterns = i18n_patterns( path('admin/', admin.site.urls), path('', include('cms.urls')), # CMS路由必须放在末尾 ) ``` 5. **模板集成** 在模板文件中添加 CMS 占位符: ```html {% load cms_tags %} <body> {% placeholder "content" %} <!-- 内容占位符 --> {% static_placeholder "footer" %} <!-- 静态占位符 --> </body> ``` 6. **现有数据迁移** - 通过 **Apphooks** 将现有应用挂载到 CMS 页面(引用[3]): ```python # myapp/cms_app.py from cms.app_base import CMSApp class MyApp(CMSApp): name = "My App" urls = ["myapp.urls"] # 指向URL配置 ``` - 在 CMS 页面高级设置中选择该 Apphook #### **关键注意事项** 1. **迁移冲突处理** - 使用 `python manage.py showmigrations` 检查迁移状态(引用[2]) - 若表已存在错误,执行: ```bash python manage.py migrate --fake # 跳过冲突迁移(谨慎使用) ``` 2. **静态文件** 重新收集静态文件: ```bash python manage.py collectstatic ``` 3. **多语言支持** 配置 `LANGUAGES` 并启用 `django.middleware.locale.LocaleMiddleware`(引用[3])。 #### **推荐资源** - [官方迁移文档](https://docs.django-cms.org/) - Django Girls 教程(引用[3]):基础 CMS 集成 - `sqlmigrate` 命令调试 SQL(引用[2]): ```bash python manage.py sqlmigrate cms 0001_initial # 查看CMS初始迁移SQL ``` > **重要提示**:迁移前务必备份数据库!CMS 会创建约 50 张新表,可能影响有模型[^2]。 --- ### **相关问题** 1. 如何处理迁移过程中的 `Table already exists` 错误? 2. 如何将现有 Django 模型数据转换为 CMS 插件? 3. 迁移到 Django-CMS 后如何保留项目的用户权限系统? 4. 在多语言项目中如何配置 CMS 的占位符翻译? [^1]: 引用自插件配置注意事项,需特殊处理 `djangocms_googlemap` 迁移问题。 [^2]: 引用自 Django 迁移问题排查指南,涉及表冲突解决方案。 [^3]: 引用自 Django 学习资源推荐,包含 CMS 集成教程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只懒得睁眼的猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值