将 URL 中的参数传递给 Django Admin add_view

Pass parameters in URL to Django Admin add_view

我需要将 URL 中的参数传递给 Django Admin add 视图,这样当我输入 URL :http://localhost:8000/admin/myapp/car/add?brand_id=1add_view读取brand_id参数。我想使用它,以便我可以为 Car.

brand 属性设置默认值
def get_form(self, request, obj=None, **kwargs):
    form = super(CarAdmin, self).get_form(request, obj, **kwargs)
    form.base_fields['brand'].initial = <<GET['brand_id']>>
    return form

用例:我想要这个是因为在我的 BrandsAdmin 中,我为每个品牌添加了一个“+”按钮,应该添加一个 CarBrand 作为 FK .

我试过从 requestget_form 中获取它,但是当执行该代码时,Django 已经更改了我的 URL 因为我猜它不理解它作为“合法”参数。

非常感谢!

您可以找到完整的解释 here,但很快:

您可以直接从视图访问查询参数,请求对象有一个方法。我想这是一个 GET 请求,所以您的实施示例是:

request.GET.getlist("brand_id")

request.GET.get("brand_id")

主要是我想做的,两步就这么简单

首先,在 list_display 中添加一列以显示 link 到 add_view:

Brand.py

@admin.display(description='Link', ordering='url')
def get_add_link(self):
    url = f"{reverse('admin:myapp_car_add')}?brand={self.id}"
    return format_html(f"<a href='{url}'><i class='fas fa-plus'></i></a>")

请注意,我将 URL 添加为 admin:<app>_<model>_<action> 的反义词,并将品牌 ID 作为参数传递。

CarAdmin.py

def get_changeform_initial_data(self, request):
    brand_id = request.GET.get('brand')
    return {'brand': brand_id}

通过在 CarAdmin class 中添加此方法,我可以将品牌设置为默认值。