kastielspb

Prefilled admin inlines (v2)

Jan 15th, 2021 (edited)
296
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.31 KB | None | 0 0
  1. from django import forms
  2. from django.conf import settings
  3. from django.contrib import admin
  4. from django.contrib.admin.utils import flatten_fieldsets
  5. from django.forms.models import BaseInlineFormSet
  6.  
  7.  
  8. class ShopLocationFormset(BaseInlineFormSet):
  9.     """
  10.    Prefilled formset
  11.    """
  12.  
  13.     def __init__(self, *args, **kwargs):
  14.         super().__init__(*args, **kwargs)
  15.         data = {item.building_id: item.building for item in self.queryset}
  16.         self.initial = [
  17.             {'building': building, 'base_shop': self.instance}
  18.             for building in (
  19.                 list(data.values())
  20.                 + list(Building.objects.exclude(id__in=data.keys()))
  21.             )
  22.         ]
  23.  
  24.  
  25. class ShopLocationForm(forms.ModelForm):
  26.  
  27.     class Meta:
  28.         fields = '__all__'
  29.         model = ShopLocation
  30.  
  31.     def __init__(self, *args, **kwargs):
  32.         shop = kwargs.get('initial', {}).pop('base_shop', None)
  33.         super().__init__(*args, **kwargs)
  34.         pavilion_qs = self.fields['pavilion'].queryset
  35.         if shop:
  36.             pavilion_qs = pavilion_qs.filter(shop=shop)
  37.  
  38.         building = self.initial.get('building')
  39.         if building:
  40.             pavilion_qs = pavilion_qs.filter(floor__building=building)
  41.  
  42.         self.fields['pavilion'].queryset = pavilion_qs
  43.         if not pavilion_qs:
  44.             self.fields['pavilion'].required = False
  45.             for field in trans_field('location'):
  46.                 self.fields[field].required = False
  47.  
  48.  
  49. class ShopLocationInline(TranslationTabularInline):
  50.     can_delete = False
  51.     form = ShopLocationForm
  52.     formset = ShopLocationFormset
  53.     model = ShopLocation
  54.  
  55.     def __init__(self, *args, **kwargs):
  56.         super().__init__(*args, **kwargs)
  57.         self.inline_count = Building.objects.count()
  58.  
  59.     def get_min_num(self, request, obj=None, **kwargs):
  60.         return self.inline_count
  61.  
  62.     def get_max_num(self, request, obj=None, **kwargs):
  63.         return self.inline_count
  64.  
  65.     def get_extra(self, request, obj=None, **kwargs):
  66.         return self.inline_count
  67.  
  68.     def formfield_for_dbfield(self, db_field, request, **kwargs):
  69.         field = super().formfield_for_dbfield(db_field, request, **kwargs)
  70.         if db_field.name == 'building':
  71.             field.widget.attrs['class'] = 'is-disabled'
  72.         return field
  73.  
  74.  
  75. ...
Add Comment
Please, Sign In to add comment