当前位置: 首页 > 面试题库 >

Django:从ModelAdmin中访问模型实例?

韩乐湛
2023-03-14
问题内容

我在网上商店应用程序中有一个Orders模型,它具有一个自动递增的主键和一个自身的外键,因为可以将订单分为多个订单,但是必须保持与原始订单的关系。

class Order(models.Model):
    ordernumber = models.AutoField(primary_key=True)
    parent_order = models.ForeignKey('self', null=True, blank=True, related_name='child_orders')
    # .. other fields not relevant here

我已经为管理站点注册了OrderAdmin类。对于详细视图,我已包含parent_orderfieldsets属性中。当然,默认情况下,这会在选择框中列出所有订单,但这不是所需的行为。相反,对于没有父订单的订单(即未与其他订单拆分;parent_order为NULL /无)的订单不应该显示。对于已拆分的订单,这应仅显示单个父订单。

有一个相当新的ModelAdmin方法可用,formfield_for_foreignkey它似乎很完美,因为可以在其中过滤查询集。想象一下,我们正在查看订单#11234的详细信息视图,该视图已从订单#11208中分离出来。代码如下

def formfield_for_foreignkey(self, db_field, request, **kwargs):
    if db_field.name == 'parent_order':
        # kwargs["queryset"] = Order.objects.filter(child_orders__ordernumber__exact=11234)
        return db_field.formfield(**kwargs)
    return super(OrderAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)

带注释的行在Python shell中运行时有效,返回单项查询集,其中包含#11234的订单#11208和可能已经从中拆分的所有其他订单。

当然,我们不能在那里硬编码订单号。我们需要引用ordernumber要查看其详细信息页面的订单实例的字段。像这样:

kwargs["queryset"] = Order.objects.filter(child_orders__ordernumber__exact=?????)

我没有找到替代?????的工作方法 并引用了“当前” Order实例,我对此进行了深入研究。self内部formfield_for_foreignkey是指ModelAdmin实例,尽管它确实具有model属性,但不是订单模型实例(它是ModelBase引用; self.model()返回一个实例,但其订单号为None)。

一种解决方案可能是从request.path(/ admin / orders / order / 11234 /)中提取订单号,但这确实很丑。我真的希望有更好的方法。


问题答案:

我认为你可能需要以稍微不同的方式来实现此目的-通过修改ModelForm而不是admin类。像这样:

class OrderForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super(OrderForm, self).__init__(*args, **kwargs)
        self.fields['parent_order'].queryset = Order.objects.filter(
            child_orders__ordernumber__exact=self.instance.pk)

class OrderAdmin(admin.ModelAdmin):
    form = OrderForm


 类似资料:
  • 问题内容: 是否可以在Scrapy管道中访问django模型,以便将已抓取的数据直接保存到模型中? 我已经看到了,但是我真的不知道如何设置它吗? 问题答案: 如果还有其他人遇到相同的问题,这就是我解决的方法。 我将其添加到我的scrapy settings.py文件中: 注意:上面的路径是到你的django项目文件夹,而不是settings.py文件。 现在,你将可以在scrapy项目中完全访问d

  • 问题内容: 如果我在Django中设置会话变量,例如: 有什么方法可以从模板中访问它,还是必须从视图中检索它,然后将其传递给模板? 询问是因为我想在模板中访问大约10个小会话变量,然后将所有10个从视图传递到模板可能会有些混乱。 (我必须使用会话变量,因为它是HttpResponseRedirect,但是出于我的目的,将变量存储在数据库中是过大的。) 那么-有什么方法可以直接在模板中获取会话变量?

  • 问题内容: 我是Python和Django的新手。我目前正在探索使用Scrapy抓取网站并将数据保存到Django数据库。我的目标是根据用户提供的域来运行蜘蛛。 我写了一个Spider来提取我需要的数据,并在调用时将其正确存储在json文件中 如刮板教程中所述。 我现在的目标是使Spider成功地将数据保存到Django数据库,然后根据用户输入来使Spider运行。 我知道与此主题相关的帖子很多,

  • 问题内容: 我的视图模型中包含以下模型 如何从Javascript访问上述属性之一? 我尝试了这个,但是我得到了“未定义” 问题答案: 您可以通过以下操作将整个服务器端模型转换为Javascript对象: 在您的情况下,如果只需要FloorPlanSettings对象,则只需传递方法that属性:

  • 在本节中,您将创建一个新的MoviesController类,并在这个Controller类里编写代码来取得电影数据,并使用视图模板将数据展示在浏览器里。 在开始下一步前,先Build一下应用程序(生成应用程序)(确保应用程序编译没有问题) 在解决方案上,用鼠标右键单击Controller文件夹,点击新增,再选择Controller。 在Scaffold新增对话框,选择MVC 5 Controll

  • 我已经将Dialogflow配置为在询问名称后发出POST请求。当我在联机请求查看器中查看信息时,我可以在查询字符串部分中看到我想要的信息: 然而,在Django,我找不到这些信息。我试图在数据库中保存完整的请求和request.meta。 服务器上收到的请求如下所示: {http_content_type':'application/json'、'http_host':'www.mysite.i