有没有办法根据条件在新页面中显示特定内联?
is there a way to display a particular inline in a new page based on a condition?
我需要根据条件在新页面中只显示一个内联,如果 url 有参数 country_id 那么我只需要显示一个内联。由于模型管理员中有表单验证,因此我无法在一个 ModelAdmin 中完成,因此我对同一模型使用了两个 modelAdmin。我在 CorporateConfig(具有表单验证的管理员)中有一个名为 get_countries 的只读字段,它将显示国家列表。如果我根据该国家/地区 ID 单击一个国家/地区,我需要在新页面上显示 CorporateBrand,它是 CorporateConfig 的内联模型(记住只需要显示内联)。
class CorporateConfigurationAdmin(admin.ModelAdmin):
form = CorporateConfigurationAdminForm
inlines = [CorporateIncludeBrandAdmin, CorporateExcludeBrandAdmin,
CorporateBrandsAdmin]
def get_urls(self):
from django.urls import path
urls = super(CorporateConfigurationAdmin,self).get_urls()
filter_url = [
path('filter_brand/',self.admin_site.admin_view(self.brand_filter), name='brand-filter'),
]
return filter_url + urls
def brand_filter(self, request, obj=None):
pass
def get_countries(self, instance):
country_list = '<ul style="font-weight: bold;list-style-type:circle;">'
countries = Country.objects.all()
print("countries", countries)
for country in countries:
url = reverse_lazy('admin:brand-filter')
print("urls is",url)
country_list += '<li class="changelist"><a href="{url}?country_id={id}" target="_blank">{country}</a></li>'.format(url=url, country=country.name,id=country.id)
country_list+='</ul>'
return mark_safe(country_list)
get_countries.short_description = 'Country Url'
Clicking on the link above should go to the custom url which is created by get_urls()
class BrandOrderFilter(CorporateConfiguration):
class Meta:
proxy = True
class CorporateInlineBaseAdmin(admin.TabularInline):
def get_queryset(self, request):
country = request.GET.get('country_id')
qs = super(CorporateInlineBaseAdmin, self).get_queryset(request)
if country:
qs = qs.filter(brand__country=country)
return qs
class CorporateBrandOrderFilterAdmin(CorporateInlineBaseAdmin):
fields = ('brand', 'order_number',)
raw_id_fields = ('brand',)
ordering = ('order_number',)
model = CorporateBrand
class BrandOrderFilteringAdmin(admin.ModelAdmin):
inlines = [CorporateBrandOrderFilterAdmin,]
现在我可以根据国家/地区进行过滤,但是模型中的字段和验证是由表单完成的。因此,我创建了另一个管理员,并且在不使用表单的情况下尝试仅显示该特定内联。不幸的是我做不到。经过 11 小时的辛勤工作,我将其发布在这里,以便我能得到一些答案。非常感谢任何帮助!!
我通过创建一个新表单并排除我需要的字段并在 url 中获取参数 request.GET.get('country_id') 来实现此功能。如果有 country_id 我正在 return 在新页面中使用我的新内联创建新表单,否则 return 包含所有内联的表单。
我需要根据条件在新页面中只显示一个内联,如果 url 有参数 country_id 那么我只需要显示一个内联。由于模型管理员中有表单验证,因此我无法在一个 ModelAdmin 中完成,因此我对同一模型使用了两个 modelAdmin。我在 CorporateConfig(具有表单验证的管理员)中有一个名为 get_countries 的只读字段,它将显示国家列表。如果我根据该国家/地区 ID 单击一个国家/地区,我需要在新页面上显示 CorporateBrand,它是 CorporateConfig 的内联模型(记住只需要显示内联)。
class CorporateConfigurationAdmin(admin.ModelAdmin):
form = CorporateConfigurationAdminForm
inlines = [CorporateIncludeBrandAdmin, CorporateExcludeBrandAdmin,
CorporateBrandsAdmin]
def get_urls(self):
from django.urls import path
urls = super(CorporateConfigurationAdmin,self).get_urls()
filter_url = [
path('filter_brand/',self.admin_site.admin_view(self.brand_filter), name='brand-filter'),
]
return filter_url + urls
def brand_filter(self, request, obj=None):
pass
def get_countries(self, instance):
country_list = '<ul style="font-weight: bold;list-style-type:circle;">'
countries = Country.objects.all()
print("countries", countries)
for country in countries:
url = reverse_lazy('admin:brand-filter')
print("urls is",url)
country_list += '<li class="changelist"><a href="{url}?country_id={id}" target="_blank">{country}</a></li>'.format(url=url, country=country.name,id=country.id)
country_list+='</ul>'
return mark_safe(country_list)
get_countries.short_description = 'Country Url'
Clicking on the link above should go to the custom url which is created by get_urls()
class BrandOrderFilter(CorporateConfiguration):
class Meta:
proxy = True
class CorporateInlineBaseAdmin(admin.TabularInline):
def get_queryset(self, request):
country = request.GET.get('country_id')
qs = super(CorporateInlineBaseAdmin, self).get_queryset(request)
if country:
qs = qs.filter(brand__country=country)
return qs
class CorporateBrandOrderFilterAdmin(CorporateInlineBaseAdmin):
fields = ('brand', 'order_number',)
raw_id_fields = ('brand',)
ordering = ('order_number',)
model = CorporateBrand
class BrandOrderFilteringAdmin(admin.ModelAdmin):
inlines = [CorporateBrandOrderFilterAdmin,]
现在我可以根据国家/地区进行过滤,但是模型中的字段和验证是由表单完成的。因此,我创建了另一个管理员,并且在不使用表单的情况下尝试仅显示该特定内联。不幸的是我做不到。经过 11 小时的辛勤工作,我将其发布在这里,以便我能得到一些答案。非常感谢任何帮助!!
我通过创建一个新表单并排除我需要的字段并在 url 中获取参数 request.GET.get('country_id') 来实现此功能。如果有 country_id 我正在 return 在新页面中使用我的新内联创建新表单,否则 return 包含所有内联的表单。