相关疑难解决方法(0)

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

我在网上商店应用程序中有一个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
Run Code Online (Sandbox Code Playgroud)

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

有一个相当新的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)
Run Code Online (Sandbox Code Playgroud)

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

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

kwargs["queryset"] = Order.objects.filter(child_orders__ordernumber__exact=?????)
Run Code Online (Sandbox Code Playgroud)

我发现没有办法替换????? 参考"当前"订单实例,我挖得很深.selfinside formfield_for_foreignkey指的是ModelAdmin实例,虽然它确实有一个model属性,但它不是订单模型实例(它是ModelBase引用; self.model()返回一个实例,但它的ordernumber是None).

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

django modeladmin django-admin

44
推荐指数
2
解决办法
2万
查看次数

django admin inlines:从formfield_for_foreignkey获取对象

我试图在django管理内联中过滤外键字段中显示的选项.因此,我想访问正在编辑的父对象.我一直在研究,但找不到任何解决方案.

class ProjectGroupMembershipInline(admin.StackedInline):
    model = ProjectGroupMembership
    extra = 1
    formset = ProjectGroupMembershipInlineFormSet
    form = ProjectGroupMembershipInlineForm

    def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
        if db_field.name == 'group':
            kwargs['queryset'] = Group.objects.filter(some_filtering_here=object_being_edited)
        return super(ProjectGroupMembershipInline, self).formfield_for_foreignkey(db_field, request, **kwargs)
Run Code Online (Sandbox Code Playgroud)

我已经验证了编辑对象时kwargs是空的,所以我无法从那里获取对象.

有什么帮助吗?谢谢

python django django-admin

16
推荐指数
4
解决办法
1万
查看次数

fields和base_fields - Django

创建平面页面时,我希望用户从预定义列表中选择模板.为了保持该Flatpage模式不变,我更喜欢ChoiceFieldModelChoiceField(后者提供模板的PK,但我需要为TEMPLATE_NAME字段中的名称):

class NewFlatpageForm(FlatpageForm):

    template_name = forms.ChoiceField(choices = [])
    def __init__(self, *args, **kwargs):
        self.base_fields['template_name'].choices = ProjectTemplate.objects.values_list('path', 'name')
        super(NewFlatpageForm, self).__init__(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

我重写__init__或Django在服务器启动时填充选项,然后不更新列表.

我没有任何管理员经验,但fields在不使用admin时我使用该属性做了类似的事情.但是在这种情况下,我得到一个异常,告诉fields它不是表单的属性.__dict__向我展示了一个base_fields属性并使用它有效.那么,为什么在这里使用base_fields,为什么fields不存在,最后我做了什么hacky?

django django-admin

11
推荐指数
2
解决办法
7295
查看次数

如何过滤Django2的autocomplete_fields中的选项?

在Django 2.0中,添加了autocomplete_fields,这很棒.

如果没有autocomplete_fields,我可以使用formfield_for_foreignkey更改ForeignKeyField的查询集.

但是将两者结合在一起并不起作用 - 看起来自动完成的选项列表是动态的,来自不同的URL,而不是来自当前的表单.

所以问题是 -

如何更改自动完成小部件中的查询集?

python django django-admin django-2.0

10
推荐指数
2
解决办法
2011
查看次数

标签 统计

django ×4

django-admin ×4

python ×2

django-2.0 ×1

modeladmin ×1