#django #django-forms
#django #django-формы
Вопрос:
Я мог бы объяснить вам все это, но я думаю, что код говорит яснее слов, поэтому:
class Skills(models.Model):
skill = models.ForeignKey(ReferenceSkills)
person = models.ForeignKey(User)
class SkillForm(ModelForm):
class Meta:
model = Skills
fields = ( 'person', 'skill')
(???)skill = forms.ModelChoiceField(queryset= SkillsReference.objects.filter(person = self.person)
Я просто предполагаю, как я могу это сделать. Но я надеюсь, вы, ребята, понимаете, что я пытаюсь сделать.
Ответ №1:
Вы можете переопределить структуру формы перед созданием экземпляра формы, например:
class SkillForm(ModelForm):
class Meta:
model = Skills
fields = ( 'person', 'skill')
На ваш взгляд:
SkillForm.base_fields['skill'] = forms.ModelChoiceField(queryset= ...)
form = SkillForm()
Вы можете переопределить его в любое время, когда захотите, на ваш взгляд, важная часть в том, что вы должны сделать это перед созданием экземпляра формы с
form = SkillForm()
Комментарии:
1. На ваш взгляд, не забудьте импортировать формы типа «из django import forms»
Ответ №2:
Предполагая, что вы используете представления на основе классов, вы можете передать набор запросов в своих kwargs формы, а затем заменить его в методе инициализации формы:
# views.py
class SkillUpdateView(UpdateView):
def get_form_kwargs(self, **kwargs):
kwargs.update({
'skill_qs': Skills.objects.filter(skill='medium')
})
return super(self, SkillUpdateView).get_form_kwargs(**kwargs)
# forms.py
class SkillForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
qs = kwargs.pop('skill_ks')
super(self, SkillForm).__init__(*args, **kwargs)
self.fields['skill'].queryset = qs
Но лично я предпочитаю этот второй подход. Я получаю экземпляр формы в представлении, а затем заменяю набор запросов поля, прежде чем django перенесет его в контекст:
# views.py
class SkillsUpdateView(UpdateView):
form_class = SkillForm
def get_form(self, form_class=None):
form = super().get_form(form_class=self.form_class)
form.fields['skill'].queryset = Skills.objects.filter(skill='medium')
return form
Ответ №3:
Ваш код выглядит почти нормально. Попробуйте эту форму навыка:
class SkillForm(ModelForm):
skill = forms.ModelChoiceField(queryset= SkillsReference.objects.filter(person = self.person)
class Meta:
model = Skills
fields = ( 'person', 'skill')
Разница в том, что skill — это поле формы, его не должно быть в метаклассе
ОТРЕДАКТИРОВАНО
Приведенное выше решение неверно, но эта ссылка описывает, как достичь того, чего вы хотите: http://www.zoia.org/blog/2007/04/23/using-dynamic-choices-with-django-newforms-and-custom-widgets/
Комментарии:
1. Ссылка разорвана