2017-08-14 65 views
0

我想根据某些用户选择的功能(在我的情况下是语言)更改模型表单选择域中显示的呈现字段。如何更改Django的ModelForm查询集中的呈现字段?

我有两个模型。在这两个模型中,'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_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时有没有办法做到这一点?

回答

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) 
相关问题