Как передать набор запросов в ModelChoiceField, используя self.field_value в Django ModelForms

#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. Ссылка разорвана