django-select2/tests/testapp/forms.py

215 lines
5.6 KiB
Python
Raw Permalink Normal View History

2015-03-03 09:01:51 +00:00
from django import forms
from django.utils.encoding import force_text
2015-03-03 09:01:51 +00:00
2015-08-06 09:58:27 +00:00
from django_select2.forms import (
2015-09-16 09:02:44 +00:00
HeavySelect2MultipleWidget, HeavySelect2Widget, ModelSelect2MultipleWidget,
ModelSelect2TagWidget, ModelSelect2Widget, Select2MultipleWidget,
Select2Widget
)
2015-03-03 09:01:51 +00:00
from tests.testapp import models
2017-04-11 11:28:39 +00:00
from tests.testapp.models import Album, City, Country
2015-03-03 09:01:51 +00:00
class TitleSearchFieldMixin:
2015-09-16 09:02:44 +00:00
search_fields = [
'title__icontains',
'pk__startswith'
2015-09-16 09:02:44 +00:00
]
2015-03-03 09:01:51 +00:00
2015-09-16 09:02:44 +00:00
class TitleModelSelect2Widget(TitleSearchFieldMixin, ModelSelect2Widget):
pass
2015-03-03 09:01:51 +00:00
2015-09-16 09:02:44 +00:00
class TitleModelSelect2MultipleWidget(TitleSearchFieldMixin, ModelSelect2MultipleWidget):
pass
2015-03-03 09:01:51 +00:00
2015-08-06 09:58:27 +00:00
2015-09-16 09:02:44 +00:00
class GenreSelect2TagWidget(TitleSearchFieldMixin, ModelSelect2TagWidget):
model = models.Genre
def create_value(self, value):
self.get_queryset().create(title=value)
class ArtistCustomTitleWidget(ModelSelect2Widget):
model = models.Artist
search_fields = [
'title__icontains'
]
def label_from_instance(self, obj):
return force_text(obj.title).upper()
class GenreCustomTitleWidget(ModelSelect2Widget):
model = models.Genre
search_fields = [
'title__icontains'
]
def label_from_instance(self, obj):
return force_text(obj.title).upper()
2015-09-16 09:02:44 +00:00
class AlbumSelect2WidgetForm(forms.ModelForm):
2015-03-03 09:01:51 +00:00
class Meta:
2015-09-16 09:02:44 +00:00
model = models.Album
2015-03-03 09:01:51 +00:00
fields = (
2015-09-16 09:02:44 +00:00
'artist',
'primary_genre',
2015-03-03 09:01:51 +00:00
)
widgets = {
2015-09-16 09:02:44 +00:00
'artist': Select2Widget,
'primary_genre': Select2Widget,
2015-03-03 09:01:51 +00:00
}
2015-09-16 09:02:44 +00:00
class AlbumSelect2MultipleWidgetForm(forms.ModelForm):
class Meta:
model = models.Album
fields = (
'genres',
'featured_artists',
)
widgets = {
'genres': Select2MultipleWidget,
'featured_artists': Select2MultipleWidget,
}
2015-03-03 09:01:51 +00:00
2015-09-16 09:02:44 +00:00
class AlbumModelSelect2WidgetForm(forms.ModelForm):
2015-03-03 09:01:51 +00:00
class Meta:
model = models.Album
fields = (
'artist',
2015-09-16 09:02:44 +00:00
'primary_genre',
2015-03-03 09:01:51 +00:00
)
2015-09-16 09:02:44 +00:00
widgets = {
'artist': ArtistCustomTitleWidget(),
'primary_genre': GenreCustomTitleWidget(),
2015-09-16 09:02:44 +00:00
}
def __init__(self, *args, **kwargs):
super(AlbumModelSelect2WidgetForm, self).__init__(*args, **kwargs)
self.fields['primary_genre'].initial = 2
2015-09-16 09:02:44 +00:00
class AlbumModelSelect2MultipleWidgetRequiredForm(forms.ModelForm):
class Meta:
model = Album
fields = (
'genres',
'featured_artists',
)
widgets = {
'genres': TitleModelSelect2MultipleWidget,
'featured_artists': TitleModelSelect2MultipleWidget,
}
2015-03-03 09:01:51 +00:00
2015-09-16 09:02:44 +00:00
class ArtistModelSelect2MultipleWidgetForm(forms.Form):
title = forms.CharField(max_length=50)
genres = forms.ModelMultipleChoiceField(widget=ModelSelect2MultipleWidget(
queryset=models.Genre.objects.all(),
search_fields=['title__icontains'],
), queryset=models.Genre.objects.all(), required=True)
featured_artists = forms.ModelMultipleChoiceField(widget=ModelSelect2MultipleWidget(
queryset=models.Artist.objects.all(),
search_fields=['title__icontains'],
), queryset=models.Artist.objects.all(), required=False)
2015-09-16 09:02:44 +00:00
2017-02-21 13:07:16 +00:00
2015-09-16 09:02:44 +00:00
NUMBER_CHOICES = [
(1, 'One'),
(2, 'Two'),
(3, 'Three'),
(4, 'Four'),
]
class Select2WidgetForm(forms.Form):
2015-09-16 09:02:44 +00:00
number = forms.ChoiceField(widget=Select2Widget, choices=NUMBER_CHOICES, required=False)
class HeavySelect2WidgetForm(forms.Form):
2015-09-16 09:02:44 +00:00
artist = forms.ChoiceField(
widget=HeavySelect2Widget(data_view='heavy_data_1'),
choices=NUMBER_CHOICES
2015-09-16 09:02:44 +00:00
)
primary_genre = forms.ChoiceField(
widget=HeavySelect2Widget(data_view='heavy_data_2'),
required=False,
choices=NUMBER_CHOICES
2015-09-16 09:02:44 +00:00
)
class HeavySelect2MultipleWidgetForm(forms.Form):
title = forms.CharField(max_length=50)
2015-09-16 09:02:44 +00:00
genres = forms.MultipleChoiceField(
widget=HeavySelect2MultipleWidget(
data_view='heavy_data_1',
choices=NUMBER_CHOICES,
attrs={'data-minimum-input-length': 0},
),
choices=NUMBER_CHOICES
2015-09-16 09:02:44 +00:00
)
featured_artists = forms.MultipleChoiceField(
widget=HeavySelect2MultipleWidget(
data_view='heavy_data_2',
choices=NUMBER_CHOICES,
attrs={'data-minimum-input-length': 0},
),
choices=NUMBER_CHOICES,
2015-09-16 09:02:44 +00:00
required=False
)
def clean_title(self):
if len(self.cleaned_data['title']) < 3:
raise forms.ValidationError("Title must have more than 3 characters.")
return self.cleaned_data["title"]
2015-09-16 09:02:44 +00:00
class ModelSelect2TagWidgetForm(forms.ModelForm):
class Meta:
model = Album
fields = ['genres']
widgets = {
'genres': GenreSelect2TagWidget
}
2017-04-11 11:28:39 +00:00
class AddressChainedSelect2WidgetForm(forms.Form):
country = forms.ModelChoiceField(
queryset=Country.objects.all(),
label='Country',
widget=ModelSelect2Widget(
search_fields=['name__icontains'],
max_results=500,
dependent_fields={'city': 'cities'},
attrs={'data-minimum-input-length': 0},
2017-04-11 11:28:39 +00:00
)
)
city = forms.ModelChoiceField(
queryset=City.objects.all(),
label='City',
widget=ModelSelect2Widget(
search_fields=['name__icontains'],
dependent_fields={'country': 'country'},
max_results=500,
attrs={'data-minimum-input-length': 0},
2017-04-11 11:28:39 +00:00
)
)
class GroupieForm(forms.ModelForm):
class Meta:
model = models.Groupie
fields = '__all__'
widgets = {
'obsession': ArtistCustomTitleWidget
}