В модель - никак. Передавайте в конструктор формы и там меняйте self.fields['card'].choices.
Переделал следующим образом:
models.py:
class Mod(models.Model):
...
card = models.ForeignKey(Card)
...
forms.py:
from django_select2 import *
class ModForm(forms.ModelForm):
card = ModelSelect2Field(
queryset=Card.objects.all(),
label=u'Карта',
widget=Select2Widget(select2_options={
'width': '600px',
'placeholder': '',
})
)
def __init__(self, *args, **kwargs):
user = kwargs.pop('user', None)
super(ModForm, self).__init__(*args, **kwargs)
if hasattr(user, 'is_superuser'):
if user.is_superuser:
self.fields['card'].queryset = Card.objects.filter(NAME__icontains=u'blahblah')
class Meta:
model = Mod
fields = ['card',]
Views.py:
def blah(request):
if request.method == 'POST':
form = ModForm(request.POST, user=request.user)
if form.is_valid():
temp = form.save(commit=False)
temp.author = request.user
temp.Code = u'blah'
temp.save()
return HttpResponseRedirect('/yep/')
else:
form = ModForm(user=request.user)
return render(request, 'blah.html', {
'form': form,
})
этот вариант рабочий, но т.к. у меня может быть довольно много карт, мне бы надо использовать HeavyModelSelect2ChoiceField вместо ModelSelect2Field.
меняя forms.py следующим образом:
from django_select2 import *
class ModForm(forms.ModelForm):
card = HeavyModelSelect2ChoiceField(
queryset=Card.objects.all(),
)
def __init__(self, *args, **kwargs):
user = kwargs.pop('user', None)
super(ModForm, self).__init__(*args, **kwargs)
if hasattr(user, 'is_superuser'):
if user.is_superuser:
self.fields['card'].queryset = Card.objects.filter(NAME__icontains=u'blahblah')
class Meta:
model = Mod
fields = ['card',]
я получаю ошибку ValueError: data_view or data_url is required.
Документация мне говорит следующее:
data_view (django.views.generic.base.View or None) – A Select2View sub-class which can respond to this widget’s Ajax queries.
data_url (str or None) – Url which will respond to Ajax queries with JSON object.
и вот на этом моменте я пока остановился. какого вида у меня должна получится вьюха, отнаследованная от Select2View, чтобы суперюзеру показывать все, а остальным фильтрованное по какому-либо условию.
хотелось бы пример решения подобной задачи, разжеванный для нубов.
p.s. django-select2-forms заменил на django-select2
Updated 16 July 2014, 11:32 by botinag.