【问题标题】:Pass parameters in URL to Django Admin add_view将 URL 中的参数传递给 Django Admin add_view
【发布时间】:2021-10-15 00:15:31
【问题描述】:

我需要将 URL 中的一个参数传递给 Django Admin add 视图,这样当我键入 URL:http://localhost:8000/admin/myapp/car/add?brand_id=1 时,add_view 会读取 brand_id 参数.我想使用它,以便为Carbrand 属性设置默认值。

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。

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

非常感谢!

【问题讨论】:

    标签: python django django-admin


    【解决方案1】:

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

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

    request.GET.getlist("brand_id")
    

    request.GET.get("brand_id")
    

    【讨论】:

    • 不确定如何应用它。我想在我的默认 edit_view 视图中获取它,我只在 CarAdmin 类中进行了配置。
    • 哦,但是请求对象是已经传递给视图的对象。你需要把它放在你高亮的地方,所以 form.base_fields['brand'].initial = request.GET.get("brand_id")
    【解决方案2】:

    主要是,对于我想做的事情,只需两步即可。

    首先,在list_display 中添加一列以显示指向add_view 的链接:

    品牌.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:&lt;app&gt;_&lt;model&gt;_&lt;action&gt; 的反面,并将品牌 ID 作为参数传递。

    CarAdmin.py

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

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

    【讨论】:

      猜你喜欢
      • 2018-03-21
      • 1970-01-01
      • 2015-08-27
      • 1970-01-01
      • 2020-03-21
      • 2022-07-12
      • 2016-01-01
      • 2016-04-22
      • 1970-01-01
      相关资源
      最近更新 更多