2011-01-01 12 views

Antwort

2

nicht sicher, ob es funktionieren würde, und ich bin nicht allzu vertraut mit inlines und dieses zusätzliche Attribut, aber man konnte mit einem python propertydjango.contrib.admin.InlineModelAdmin und ersetzen Sie die InlineModelAdmin.extra Attribut Unterklasse:

from django.contrib import admin 
from myproject.myapp.models import MyInlineModel 

class DynamicExtraInlineModelAdmin(admin.InlineModelAdmin): 

    @property 
    def extra(): 
     return 1 if some_logic else 0 

admin.site.register(MyInlineModel, DynamicExtraInlineModelAdmin) 
+0

Ich habe das abgelehnt, weil es nicht funktioniert. Vielleicht hat es in einer früheren Version von Django funktioniert (ich verwende v1.6), aber jetzt gibt es einen Code, um das Klassenattribut für einen Integer-Typ zu testen, und das schlägt fehl. Die neueste Antwort, die unten vorgeschlagen, Unterklassen und Einstellungen kwargs ['extra'] sieht die beste Option. – lfagundes

1

Sie haben soeben Affe Patch Djangos (1.3.1) Quellcode wie folgt:

Zuerst fügen Sie den folgenden Code in Ihre App:

from django.forms.models import inlineformset_factory 
from django.contrib.admin.util import flatten_fieldsets 
from django.utils.functional import curry 
from django.contrib.admin.options import InlineModelAdmin 

class MyInlineModelAdmin(InlineModelAdmin): 
    #extra = 1 
    def get_formset(self, request, obj=None, **kwargs): 
     """Returns a BaseInlineFormSet class for use in admin add/change views.""" 
     if self.declared_fieldsets: 
      fields = flatten_fieldsets(self.declared_fieldsets) 
     else: 
      fields = None 
     if self.exclude is None: 
      exclude = [] 
     else: 
      exclude = list(self.exclude) 
     exclude.extend(kwargs.get("exclude", [])) 
     exclude.extend(self.get_readonly_fields(request, obj)) 
     # if exclude is an empty list we use None, since that's the actual 
     # default 
     exclude = exclude or None 
     if obj and hasattr(obj, 'id'): # <<======================================= 
      _extra = 0 
     else: 
      _extra = self.extra 
     defaults = { 
      "form": self.form, 
      "formset": self.formset, 
      "fk_name": self.fk_name, 
      "fields": fields, 
      "exclude": exclude, 
      "formfield_callback": curry(self.formfield_for_dbfield, request=request), 
      "extra": _extra, 
      "max_num": self.max_num, 
      "can_delete": self.can_delete, 
     } 
     defaults.update(kwargs) 
     return inlineformset_factory(self.parent_model, self.model, **defaults) 

class MyTabularInline(MyInlineModelAdmin): 
    template = 'admin/edit_inline/tabular.html' 

und vorausgesetzt, Ihre Modelle sind so etwas wie:

class ListModelInline(MyTabularInline): # <<================================= 
    model = MyModel 

class ContainerModelAdmin(admin.ModelAdmin): 
    inlines = (ListModelInline,) 

admin.site.register(ContainerModel, ContainerModelAdmin) 
#etc... 
2

Sie Vererbung nutzen können, nur ..

// based on some condition 
kwargs['extra'] = something 
......... 
return super(*******Inline, self).get_formset(request, obj, **kwargs) // 'defaults.update(kwargs)' takes care of the dynamic overriding 

Die get_formset Methode von meinem Projekt:

class ContainerModel(models.Model): 
    pass #etc... 

class ListModel(models.Model): 
    pass #etc... 

dann admins ändern:

def get_formset(self, request, obj=None, **kwargs): 
    ## Put in your condition here and assign extra accordingly 
    if obj is None: 
     return super(ImageInline, self).get_formset(request, obj, **kwargs) 
    current_topic = TopicPage.objects.get(pk = obj.id) 
    topic_images = ThruImage.objects.filter(topic = current_topic) 

    kwargs['extra'] = 0 
    if len(topic_images) <= 3: 
     kwargs['extra'] = 3 - len(topic_images) 
    return super(ImageInline, self).get_formset(request, obj, **kwargs) 

Dies ist natürlich nur für einfache Bedingungen nützlich, die auf dem übergeordneten Modellobjekt basieren.

Verwandte Themen