如何更改Django的ModelForm查询集中的渲染字段?

时间:2017-08-14 08:54:57

标签: django

我想根据一些用户选择的功能更改模型表单选择字段中显示的渲染字段,这是我的语言。

我有两个型号。在这两者中,'Vastausvaihtoehto'模型以英语和芬兰语保存答案,将其保存到数据库中。它默认返回芬兰语答案,因为这就是我定义 unicode 函数的方式:

模型

class Vastausvaihtoehto(models.Model):

    ...

    vastaus_fi = models.CharField(
        verbose_name=_(u'Vastaus'),
        max_length=256,
        null=True,
        blank=True,
)   

    vastaus_en = models.CharField(
        verbose_name=_(u'Vastaus_en'),
        max_length=256,
        null=True,
        blank=True,
)

    ...


    def __unicode__(self):
        return u'%s' % (self.vastaus_fi)


class Valinta(models.Model):


    organisaatio = models.ForeignKey(
        Organisaatio,
        related_name=_(u'valinta'),
        null=True,
        blank=True,
        on_delete=models.CASCADE,
    )

    kysymys = models.ForeignKey(
        Kysymysvaihtoehto,
        related_name=_(u'valinta'),
        null=True,
        blank=True,
    )

    vastausvaihtoehto = models.ForeignKey(
        Vastausvaihtoehto,
        related_name=_(u'valinta'),
        null=True,
        blank=True,
    )

    def __unicode__(self):
        return u'%s' % (self.kysymys)

我还有一个ModelForm,用于选择正确的选择

表格

class ValintaForm(ModelForm):

class Meta:
    model = Valinta
    fields = '__all__'
    widgets = {
        'organisaatio':forms.HiddenInput(),
        'kysymys':forms.HiddenInput(),
        'vastausvaihtoehto':forms.RadioSelect(),
    }

这是我的观点:

查看

class kysymys(View):
    template_name = 'mytemplate.html'
    success_url = 'something'

    def get(self, request, pk, question_id, *args, **kwargs):

        kysymys = Kysymysvaihtoehto.objects.get(kysymys_id=int(question_id))
        vastausvaihtoehdot = Vastausvaihtoehto.objects.filter(kysymysvaihtoehto=kysymys)
        if request.LANGUAGE_CODE == 'fi':
            # What do I put here?
        else:
            # What do I put in here?


        form = ValintaForm()
        form.fields['vastausvaihtoehto'].queryset = vastausvaihtoehdot
        form.fields['vastausvaihtoehto'].empty_label = None

        return render(request, self.template_name, {
                                                'form':form,
                                                'kysymys':kysymys,
                                                "pk":pk,
                                                "question_id":question_id,
                                                })

我尝试使用values和values_list查询某些特定值,并将它们设置为ModelForm查询集:

#Like so:  
answers_en = Vastausvaihtoehto.objects.filter(kysymysvaihtoehto=kysymys).values_list('pk','vastaus_en')

form.fields['vastausvaihtoehto'].queryset = answers_en

但这并不能正确呈现表单。我应该在'Vastausvaihtoehto'模型中添加一个辅助方法,该模型在调用时会返回英文名称吗?

我知道可以通过不使用ModelForms来规避这一点,但是在使用ModelForm时有没有办法做到这一点?

1 个答案:

答案 0 :(得分:0)

使用__init__方法定义ModelForm,该方法将接受language和question_id作为关键字参数。

class ValintaForm(ModelForm):

    class Meta:
        model = Valinta
        fields = '__all__'
        widgets = {
            'organisaatio':forms.HiddenInput(),
            'kysymys':forms.HiddenInput(),
            'vastausvaihtoehto':forms.RadioSelect(),
        }

    def __init__(self, *args, **kwargs):
        language = kwargs.pop('language', None)
        question_id = kwargs.pop('question_id')
        super(ValintaForm, self).__init__(*args, **kwargs)
        if language == "fi":
            kysymys = Kysymysvaihtoehto.objects.get(kysymys_id=int(question_id))
            vastausvaihtoehdot = Vastausvaihtoehto.objects.filter(kysymysvaihtoehto=kysymys)
            self.fields['vastausvaihtoehto'].queryset = vastausvaihtoehdot
        else:
            # put your other conditions here
            pass

在您的视图中,初始化表单时,请传递关键字参数

form = ValintaForm(language=request.LANGUAGE_CODE, question_id=question_id)

或者如果您认为它更好,您可以将整个查询集传递给表单。

    def __init__(self, *args, **kwargs):
        qs = kwargs.pop('qs')
        super(ValintaForm, self).__init__(*args, **kwargs)
        self.fields['vastausvaihtoehto'].queryset = qs

初始化表单时传递查询集

form = ValintaForm(qs=vastausvaihtoehdot)