Как можно получить переведенные значения в select? - PullRequest
2 голосов
/ 21 июня 2019

Я получаю select со значениями Without и With.Как я могу получить уже переведенные значения Без и С в django.po в select?

models.py

CONFIRMATION_WITHOUT = 'without'
CONFIRMATION_OTHER = 'other'
CONFIRMATION_WITH = 'with'

CONFIRMATION_CHOICES = (
    (CONFIRMATION_WITHOUT, _('Without')),         #Без
    (CONFIRMATION_OTHER, _('Other')),             #Другое
    (CONFIRMATION_WITH, _('With')),               #С
)

income_proof = models.CharField(_('proof'), max_length=255, choices=CONFIRMATION_CHOICES, default=CONFIRMATION_WITHOUT)
#[u'without', u'with']

forms.py

income_proof = forms.ModelChoiceField(queryset=CreditPayment.objects.values_list('income_proof', flat=True).distinct(), widget=forms.Select(attrs={'class': 'selectpicker form-control', 'title':_("Income proof")}))

html

{{ form.income_proof }}

Можно сделать в форме, например?

<select>
    <option value = "CONFIRMATION_WITHOUT">Без</option>
</select>

1 Ответ

1 голос
/ 21 июня 2019

Для формы вы должны , а не использовать ModelChoiceField [Django-doc] . В самом деле, вы не выбираете объект модели, а значение. Таким образом, вместо этого вы должны использовать ChoiceField [Django-doc] .

Что касается параметров, я думаю, что вы хотите использовать CONFIRMATION_CHOICES, поскольку, используя набор запросов, вы запрашиваете базу данных, и, таким образом, вы можете выбрать только income_proof s, которые уже выбраны other записей.

from app.models import <b>CONFIRMATION_CHOICES</b>
from django import forms

class MyForm(forms.ModelForm):
    income_proof = forms.<b>ChoiceField</b>(
        <b>choices</b>=<b>CONFIRMATION_CHOICES</b>,
        widget=forms.Select(
            attrs={'class': 'selectpicker form-control', 'title':_('Income proof')}
        )
    )

или, если вы хотите только те значения, которые были выбраны, вы можете использовать:

from app.models import CONFIRMATION_CHOICES
from django import forms

class MyForm(forms.ModelForm):
    income_proof = forms.<b>ChoiceField</b>(
        choices=[],
        widget=forms.Select(
            attrs={'class': 'selectpicker form-control', 'title':_('Income proof')}
        )
    )

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        render = dict(CONFIRMATION_CHOICES)
        self.fields['income_proof'].choices = [
            <b>(k, render.get(k, k))</b>
            for k in CreditPayment.objects.values_list('income_proof', flat=True).distinct()
        ]

Здесь __init__ вызывается, когда мы создаем форму. Сначала мы позволим супер-конструктору выполнить работу по созданию полей, а затем создадим словарь из CONFIRMATION_CHOICES.

Затем мы выполняем запрос (тот же, который вы использовали), чтобы получить значения базы данных для income_proof, и мы используем словарь для сопоставления их с соответствующими переводами. Таким образом, мы получаем список из двух кортежей в качестве выбора для этого поля формы.

Здесь мы используем параметр choices= [Django-doc] , который должен содержать:

choices

Либо итерация из 2-х кортежей для использования в качестве выбора для этого поля, либо вызываемый, который возвращает такой итеративный. Этот аргумент принимает то же самое форматирует как аргумент choices для поля модели. Посмотреть модель полевая справочная документация по выбору для более подробной информации. Если Аргумент является вызываемым, он оценивается каждый раз, когда форма поля инициализируется. По умолчанию используется пустой список.

...