Django admin form with predefined lines

The problem is that embedded models have some of their fields pre-selected according to another model.

Here is an example:

class Document(models.Model): DOC_TYPES = ((DC1, 'Doc type 1'), (DC2, 'Doc type 2')) doctype = model.CharField(choices=DOC_TYPES, default=DC1) class OptionCategory(models.Model): name = model.CharField() class Option(models.Model): document = models.ForeignKey(Document) option_category = models.ForeignKey(OptionCategory) some_data = models.CharField() 

Suppose a parameter is defined inside a string in the document model manager.

OptionCategory - they can be added by the administrator - I would like to have a creation form for the Document with as many parameter models in built-in forms as there are option categories. This can be easily achieved using additional features in the Option model admin. Questions:

  • How to display inline fields with each selected category of parameters?
  • How to change parameters dynamically (based on Document.doctype after adding a similar doctype field to OptionCategory ) - preferably with ajax?
+6
source share
1 answer
  • How to present inline fields, each of which has the following type of options:

models.py

  class DocType(models.Model): name = models.CharField(max_length=255) def __unicode__(self): return self.name class Document(models.Model): doc_type = models.ForeignKey(DocType) some_data = models.CharField(max_length=255) def __unicode__(self): return self.some_data class OptionType(models.Model): name = models.CharField(max_length=255) doc_type = models.ForeignKey(DocType) def __unicode__(self): return self.name class Option(models.Model): document = models.ForeignKey(Document) option_type = models.ForeignKey(OptionType) some_data = models.CharField(max_length=255) def __unicode__(self): return self.some_data 

admin.py

  class InlineOption(admin.TabularInline): model = Option extra = 3 initial = [ {'some_data': 'init_val1', 'option_type': 1}, {'some_data': 'init_val2'}, ] create_from_default = True def get_formset(self, request, obj=None, **kwargs): initial = self.initial[:] class _Form(forms.ModelForm): form_initial = initial def __init__(self, *args, **kwargs): if len(self.form_initial) and not 'instance' in kwargs: kwargs['initial'] = self.form_initial.pop(0) return super(_Form, self).__init__(*args, **kwargs) if self.create_from_default: if request.method == 'GET': self.form = _Form else: self.form = forms.ModelForm else: self.form = _Form return super(InlineOption, self).get_formset(request, obj, **kwargs) class AdminDocument(admin.ModelAdmin): inlines = [InlineOption] 
+3
source

All Articles