39đź‘Ť
Ok, this is my solution using above classes.
I added a bunch more filters to filter it correctly, but I wanted to make the code readable here.
This is exactly what I was looking for, and I found my solution here: http://www.slideshare.net/lincolnloop/customizing-the-django-admin#stats-bottom (slide 50)
Add the following to my admin.py:
class CustomerForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(CustomerForm, self).__init__(*args, **kwargs)
wtf = Category.objects.filter(pk=self.instance.cat_id);
w = self.fields['categories'].widget
choices = []
for choice in wtf:
choices.append((choice.id, choice.name))
w.choices = choices
class CustomerAdmin(admin.ModelAdmin):
list_per_page = 100
ordering = ['submit_date',] # didnt have this one in the example, sorry
search_fields = ['name', 'city',]
filter_horizontal = ('categories',)
form = CustomerForm
This filters the “categories” list without removing any functionality! (ie: i can still have my beloved filter_horizontal :))
The ModelForms is very powerful, I’m a bit surprised it’s not covered more in the documentation/book.
18đź‘Ť
As far as i can understand you, is that you basically want to filter the shown choices according to some criteria (category according to city).
You can do exactly that by using limit_choices_to
attribute of models.ManyToManyField
. So changing your model definition as…
class Customer(models.Model):
name = models.CharField(max_length=200)
city = models.ForeignKey(City)
categories = models.ManyToManyField(Category, limit_choices_to = {'available_in': cityId})
This should work, as limit_choices_to
, is available for this very purpose.
But one things to note, limit_choices_to
has no effect when used on a ManyToManyField with a custom intermediate table. Hope this helps.
- [Django]-How to find pg_config path
- [Django]-Django return HttpResponseRedirect to an url with a parameter
- [Django]-Loading fixtures in django unit tests
11đź‘Ť
Another way is with formfield_for_manytomany
in Django Admin.
class MyModelAdmin(admin.ModelAdmin):
def formfield_for_manytomany(self, db_field, request, **kwargs):
if db_field.name == "cars":
kwargs["queryset"] = Car.objects.filter(owner=request.user)
return super(MyModelAdmin, self).formfield_for_manytomany(db_field, request, **kwargs)
Considering that “cars” are the ManyToMany field.
Check this link for more info.
- [Django]-How to lookup django session for a particular user?
- [Django]-What is the path that Django uses for locating and loading templates?
- [Django]-Logging requests to django-rest-framework
2đź‘Ť
I think this is what you’re looking for:
http://blog.philippmetzler.com/?p=52
we use django-smart-selects:
http://github.com/digi604/django-smart-selects
Philipp
- [Django]-Dynamically limiting queryset of related field
- [Django]-Equivalent of PHP "echo something; exit();" with Python/Django?
- [Django]-How to change field name in Django REST Framework
1đź‘Ť
Since you’re selecting the customer’s city and categories in the same form, you would need some javascript to dynamically whittle down the categories selector to just the categories available in the city selected.
- [Django]-Uwsgi installation error in windows 7
- [Django]-Django Forms: pass parameter to form
- [Django]-Django formsets: make first required?
0đź‘Ť
Like Ryan says, there has to be some javascript to dynamically change the options based on what the user selects. The posted solution works if city is saved and the admin form is reloaded, thats when the filter works, but think of a situation where a user wants to edit an object and then changes the city drop down but the options in category wont refresh.
- [Django]-Django App Improperly Configured – The app module has multiple filesystem locations
- [Django]-How to specify an IP address with Django test client?
- [Django]-Serving dynamically generated ZIP archives in Django
-2đź‘Ť
Category.objects.filter(available_in=cityobject)
That should do it. The view should have the city that the user selected, either in the request or as a parameter to that view function.
- [Django]-Test sending email without email server
- [Django]-How to access a dictionary element in a Django template?
- [Django]-URL-parameters and logic in Django class-based views (TemplateView)