Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从函数调用中提高Http404的替代方法,(Django FormView)?

从函数调用中提高Http404的替代方法,(Django FormView)?
EN

Stack Overflow用户
提问于 2020-12-16 13:30:33
回答 1查看 67关注 0票数 1

我有一个FormView,它在模板中呈现一个ModelForm。该表单包括基于动态查询集的ModelChoiceField,该查询集在初始化表单时在kwargs中传递(请参见下面视图的完整代码)。

代码语言:javascript
运行
AI代码解释
复制
 def get_form_kwargs(self, **kwargs):
    """ Provides keyword arguemnt """

    kwargs = super(NameofView, self).get_form_kwargs()

    queryset = self.my_custom_method(self.param1, self.param2)
    kwargs.update({"queryset": queryset})

    return kwargs

此查询集由使用会话的值的初始数据库查询确定,并进一步筛选。在到达上述方法之前,有相当多的方法在运行,因此在request.POST和request.GET中都形成了相同的查询集。

具体来说,我称之为一种方法:

代码语言:javascript
运行
AI代码解释
复制
 def get_initial_queryset(self, session_variable1, session_variable2):
     
    initial_queryset = Model.objects.filter(
        attr1=session_variable1
    ).filter(
        attr2__gte=session_variable2)
    
    if not initial_queryset:
        raise Http404("Sorry, none available")
    return initial_queryset

我正在考虑这样一种情况,即这个初始查询不返回任何结果。下面的方法会产生错误,最终表单将不会呈现,这将是一个相当大的灾难!

因此,我需要以某种方式打破这一流程,并提供一条类似于“对不起没有发现任何东西”的消息。

正如您所看到的,我目前有if not initial_queryset: raise Http404(),但是我对这个解决方案并不满意,因为从技术上讲,它不是一个“未找到的页面”,需要为这个场景提供一个自定义消息。

我倾向于将用户重定向到另一个视图,并呈现一条带有链接的消息,以返回、编辑他们的搜索(例如)。

我尝试过返回HttpResponseRedirect(),但这只是将响应对象分配给调用函数的变量!

有什么更好的办法来解决这个问题吗?

代码语言:javascript
运行
AI代码解释
复制
class NameofView(FormView):


model = Model
template_name = "app/template.html"
form_class = RefineSelectionForm

def get_initial_queryset(self, session_variable1, session_variable2):
    initial_queryset = Model.objects.filter(
        attr1=session_var1
    ).filter(
        attr2__gte=session_var2)
    if not initial_queryset:
        raise Http404("Sorry, none available")
    return initial_queryset

def refine_queryset1(self, session_var1, session_var2, session_var3):
    initial_queryset = self.get_initial_queryset(session_var1, session_var2)
    refined_qs1 = initial_queryset.filter(session_var1__gte=session_var1)[:3]
    return refined_qs1

def refine_queryset2(self, self, session_var1, session_var2, session_var3):
    initial_queryset = self.get_intitial_queryset(session_var1, session_var2)
    refined_qs2 = initial_queryset.filter(attr__lt=date).order_by("-date")[:3]
    return refined_qs2

def my_custom_method(self, param1, param2):
    """Creates the queryset that will be used by the ModelChoiceField
    in the Form"""

    # Merge both queries
    queryset = param1 | param2
    return queryset

def get_initial(self):
    # Retrieve values from the session
    session_variable1 = self.request.session["session_variable1"]
    self.session_variable2 = self.request.session["session_variable2"]
    self.session_variable3 = self.request.session["session_variable3"]

    ..comparisons etc...

    if condition:
        initial_data = initial_data1
    else:
        initial_data = initial_data2

    initial = super(NameofView, self).get_initial()
    initial.update({"formfield": initial_data})
    return initial

def get_form_kwargs(self, **kwargs):
    kwargs = super(NameofView, self).get_form_kwargs()
    queryset = self.my_custom_method(self.param1, self.param2)
    kwargs.update({"queryset": queryset})
    return kwargs

def get_context_data(self, **kwargs):
    context = super(NameofView, self).get_context_data(**kwargs)       
    queryobject = Model.objects.filter(pk=self.session_variable1)
    context["some_data"] = self.session_variable2
    context["some_object"] = queryobject
    return context

def form_valid(self, form):
    ...code...
    return redirect("named_path", args)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-16 14:42:03

在进入表单逻辑之前,我将重写get函数来执行基本验证。

代码语言:javascript
运行
AI代码解释
复制
from django.shortcuts import render

def get(self, request, *args, **kwargs)
    if not self.get_available_trips().exists():
        return render(request, "some_unavailable_template", context={"message": "your message"})
    return super().get(request, *args, **kwargs)

正如您已经发现的,重定向不允许您自定义消息。如果设置为重定向,则可以重定向到另一个通过相同逻辑确定旅行不可用的视图,然后显示一条消息。您可能会将一些常见的函数提取到视图混合器中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65331387

复制
相关文章
Android网页打开指定App
首先,要给你要打开的应用中的activity设置过滤器,一般是启动的activity。
xiangzhihong
2022/05/09
2.4K0
App在后台运行的思与做
前言: 当一个应用程序在后台运行时,它在屏幕上是不可见的。当用户启动另一个应用程序或返回到主屏幕时,应用程序从前台切换到后台。当然,应用程序也可以在后台启动或恢复,以处理特定的事件。 失活的操作 当一个正在前台的应用程序移动到后台时,UIKit首先调用applicationWillResignActive:方法来禁用应用程序(使App失活)。当App失活,会做出以下几点操作: 1、将用户数据保存到磁盘并关闭任何打开的文件: 应用程序被终止时,始终保存用户数据。同样用户锁住设备时,关闭文件。 2、只做
Dwyane
2018/06/12
1.4K0
如何使程序在Linux后台运行
这样一来,test程序就在后台运行了。但是,这样处理还不够,因为这样做虽然程序是在后台运行了,但log依然不停的输出到当前终端。因此,要让终端彻底的清静,还应将log重定向到指定的文件:
阿凡亮
2020/04/14
9.7K0
在Windows上如何后台运行JuiceFS
JuiceFS的Badger引擎改造完成以后,需要在Windows下面进行后台运行。因为现有的JuiceFS中还没有在Windows下的后台运行实现,所以需要通过其他途径解决。
用户1260683
2022/03/30
3.5K0
在Windows上如何后台运行JuiceFS
使程序在Linux下后台运行
我们计算的程序都是周期很长的,通常要几个小时甚至一个星期。我们用的环境是用putty远程连接到日本Linux服务器。所以使程序在后台跑有以下三个好处:
SingYi
2022/07/14
5K0
在 Linux or windows 上后台运行服务
  此时可以访问 http://ip:8000 验证服务是否成功启动了(详细操作见另一篇文章-Python 一行搭建文件服务器)
我是胖虎啊
2022/06/27
4K0
在 Linux or windows 上后台运行服务
Azure 使用 Web App 服务运行 Docker 镜像
最近在完善 CanalSharp 的文档,采用的是 vuepress 生成的文档网站,生成以后变考虑如何部署这个文档,考虑过 github pages,但是不想将这堆生成出来的文件往仓库里面加,所有便想着寻找其他方法。在 Azure 上看到了 Web App 这个服务,发现部署比较简单、快速,并且支持 github ci/cd ,下面分享一下我的使用记录。
晓晨
2021/01/06
8990
[Tensorflow] 在Android运行TensorFlow模型
以下代码来自于TensorFlowObjectDetectionAPIModel.java
wOw
2018/09/18
2.2K0
【Android初级】如何让APP无法在指定的系统版本上运行
随着市面上越来越多三方APP的出现,某些手机厂商也开始对这些APP进行了安装限制或者运行限制,或者三方APP自身的版本过低,无法被特定的系统版本所支持。
netkiller old
2021/02/12
3.7K0
【Android初级】如何让APP无法在指定的系统版本上运行
在云主机后台进行python程序运行
nohup python main.py & nohup liunx自带的命令 注意:后面(&)!
py3study
2020/01/20
2.1K0
Android 运行时权限及APP适配
Android 6.0起,Android加强了权限管理,引入运行时权限概念。对于: 1. Android 5.1(API 22)及以前版本,应用权限必须声明在AndroidManifest.xml中,应用在安装时,Android会列出其所需的所有权限供用户确认安装。 2. Android 6.0(API 23)及以后版本,应用权限必须声明在AndroidManifest.xml中,但权限分为普通权限(Normal Permissions)和危险权限(Dangerous Permissions),以下会介绍区
宋凯伦
2018/04/02
1.5K0
Android 运行时权限及APP适配
在Spring Boot中配置web app
正如我们之前文章中提到的,要想配置端口需要在application.properties文件中配置如下:
程序那些事
2020/07/07
2K0
Android 运行时权限及APP适配
Android 6.0起,Android加强了权限管理,引入运行时权限概念。对于:
宋凯伦
2018/07/31
1.5K0
Android 运行时权限及APP适配
Android开发:App点击跳转到网页的实现
App里面的代码根据网址链接进行网页跳转是比较常用的方式,而且这种方式也比较简单,这里按照facebook来进行举例说明,具体代码如下所示:
网易Leo
2021/12/04
2.9K0
Android开发:App点击跳转到网页的实现
App里面的代码根据网址链接进行网页跳转是比较常用的方式,而且这种方式也比较简单,这里按照facebook来进行举例说明,具体代码如下所示:
三掌柜
2021/12/01
1.2K0
app后台技术
首先应用程序框架,随你自己业务需求而定,可以选择SSH或者SSM,或者看自己业务量大小。
PM吃瓜
2019/08/12
1K0
app后台技术
在Android系统上运行frp
一时兴起,想在Android上跑一下frpc,本来以为需要在PC上交叉编译后放到机器上才行,后来发现好像更简单,Android YYDS!
老高的技术博客
2022/12/28
4.9K0
在Android系统上运行frp
Android 后台运行白名单,优雅实现保活
我们知道,Android 系统会存在杀后台进程的情况,并且随着系统版本的更新,杀进程的力度还有越来越大的趋势。系统这种做法本身出发点是好的,因为可以节省内存,降低功耗,也避免了一些流氓行为。
NanBox
2020/01/03
9.4K1
在linux后台运行脚本的方法和命令
后台运行脚本 执行脚本test.sh:./test.sh 中断脚本test.sh:ctrl+c 在1的基础上将运行中的test.sh,切换到后台并暂停:ctrl+z 执行ctrl+z后,test.sh在后台是暂停状态(stopped),使用命令:bg number让其在后台开始运行(“number”是使用jobs命令查到的 [ ]中的数字,不是pid) 直接在后台运行脚本test.sh:./test.sh & 查看当前shell环境中已启动的任务情况:jobs 将test.sh切换到前台运行:fg %number(”number”为使用jobs命令查看到的 [ ] 中的数字,不是pid) 中断后台运行的test.sh脚本:先fg %number切换到前台,再ctrl+c;或是直接kill %number 以上两种在后台运行test.sh的方法,当遇到退出当前shell终端时,后台运行的test.sh也就结束了。这是因为以上两种方法使得test.sh在后台运行时,运行test.sh进程的父进程是当前shell终端进程,关闭当前shell终端时,父进程退出,会发送hangup信号给所有子进程,子进程收到hangup以后也会退出。所以要想退出当前shell终端时test.sh继续运行,则需要使用nohup忽略hangup信号。
大数据流动
2020/06/19
4K0
点击加载更多

相似问题

Android:后台运行App

22

android studio运行app后台运行

21

后台运行的Android Unity App

1113

Android app:后台运行的是什么?

31

即使app不在运行或者不在后台,如何调用web服务?Android

13
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档