【问题标题】:How to change the rendered field in Django's ModelForm queryset?如何更改 Django 的 ModelForm 查询集中的渲染字段?
【发布时间】:2017-08-14 08:54:56
【问题描述】:

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

我有两个模型。在这两者中,“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 来规避这个问题,但是有没有办法在使用 ModelForms 时做到这一点?

【问题讨论】:

    标签: django


    【解决方案1】:

    使用__init__ 方法定义您的 ModelForm,该方法将接受语言和 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)
    

    【讨论】:

      猜你喜欢
      • 2017-03-25
      • 1970-01-01
      • 2010-10-05
      • 2016-04-22
      • 2012-02-25
      • 2018-11-19
      • 1970-01-01
      • 1970-01-01
      • 2018-07-07
      相关资源
      最近更新 更多