I have two models Category and Products.
- a Product can have multiple Categories
- a Category can have multiple Products.
- Categories have a circular Foreign key, to itself.
- not all Categories have the same depth level
Example:
- Category A
- Category A_1
- category A_2
- Category A_2_1
- Category B
- Category C
- Category C_1
models.py
class Product:
categories = models.ManyToManyField(Category)
name = models.CharField(max_length=255)
class Category:
categories = models.ForeignKey(self)
name = models.CharField(max_length=255)
As Form I use a ModelForm:
class ProductForm(ModelForm):
class Meta:
model = Product
fields = ['categories', 'name', 'short_description', 'description']
widgets = {
'categories': MyWidget,
}
What I want to achieve:
I want to implement a conditional select (narrow options) On Product Form creation:
- Only top parent Categories(level 0 A,B,C) are available
- The user select a parent Category. If the parent has children a new Select box appear with his children(category level 1 A1,C1)
The user select a level 1 Category (A1,C1). If the parent has children a new Select box appear with his children(level 2 A2)
- The process is repeated until no children are availavable(recursive), an user select the "smallest" category in the tree
- A new button is available for the user to add more categories and start the 1-3 process again
- I want to do the select,add new select using JavaScript
- On Form Submit I want to send only the last children categories
Options I thought:
- Change the ManyToMany coresponding default Fields - looks like there are no good hooks and/or inheritance
- Use a non-default custom Field instean of ManytoMany(like Charfield) - more complex on clean,saving Form
- Change/Inherit the widget. My issues is how to send the data to the default Field on submit, and get/show it on edit
Practical, let's say I have 7 Select Boxes, with the values for each:
- Parent1->Child11->Child111
- Parent2->Child21
- Parent3->Child31->Child311
How do I tell Django on browser submit(with other data) to send to ManyToMany the last Child in all three of them
I can gather them with Javascript, but I have to tell Django get this data, this is what you need.
I need some help as code and indication how to do this.