Я пытаюсь использовать ModelForm для добавления моих данных. Это работает хорошо, за исключением того, что выпадающий список ForeignKey показывает все значения, и я только хочу, чтобы это отобразило значения что подходящее для зарегистрированного пользователя.
Вот моя модель для ExcludedDate, запись, которую я хочу добавить:
class ExcludedDate(models.Model):
date = models.DateTimeField()
reason = models.CharField(max_length=50)
user = models.ForeignKey(User)
category = models.ForeignKey(Category)
recurring = models.ForeignKey(RecurringExclusion)
def __unicode__(self):
return self.reason
Вот модель для категории, которая является таблицей, содержащей отношения, которые я хотел бы ограничить пользователем:
class Category(models.Model):
name = models.CharField(max_length=50)
user = models.ForeignKey(User, unique=False)
def __unicode__(self):
return self.name
И наконец, код формы:
class ExcludedDateForm(ModelForm):
class Meta:
model = models.ExcludedDate
exclude = ('user', 'recurring',)
Как я заставляю форму отображать только подмножество категорий, где category.user равняется зарегистрированному пользователю?
Вы можете настроить свою форму в init
class ExcludedDateForm(ModelForm):
class Meta:
model = models.ExcludedDate
exclude = ('user', 'recurring',)
def __init__(self, user=None, **kwargs):
super(ExcludedDateForm, self).__init__(**kwargs)
if user:
self.fields['category'].queryset = models.Category.objects.filter(user=user)
И в представлениях при создании формы, помимо стандартных параметров формы, вы также укажете текущего пользователя:
form = ExcludedDateForm(user=request.user)
Вот пример:
models.py
class someData(models.Model):
name = models.CharField(max_length=100,verbose_name="some value")
class testKey(models.Model):
name = models.CharField(max_length=100,verbose_name="some value")
tst = models.ForeignKey(someData)
class testForm(forms.ModelForm):
class Meta:
model = testKey
views.py
...
....
....
mform = testForm()
mform.fields["tst"] = models.forms.ModelMultipleChoiceField(queryset=someData.objects.filter(name__icontains="1"))
...
...
Или вы можете попробовать что-то вроде этого:
class testForm(forms.ModelForm):
class Meta:
model = testKey
def __init__(self,*args,**kwargs):
super (testForm,self ).__init__(*args,**kwargs)
self.fields['tst'].queryset = someData.objects.filter(name__icontains="1")