Django ModelChoiceField - использовать что-то кроме id? - PullRequest
10 голосов
/ 22 марта 2012

Скажем, у меня есть таблица address, и у нее есть поле postal_code - ModelChoiceField не позволяет мне использовать что-то кроме PK для проверки правильности существования?Каков будет путь?Нормальный ввод и использование clean_*()?

Ответы [ 3 ]

23 голосов
/ 17 июля 2012

А как насчет to_field_name?Я не уверен, документировано ли это где-либо, но вы можете легко найти его между ModelChoiceField параметрами конструктора: https://github.com/django/django/blob/master/django/forms/models.py. Он используется для фильтрации набора запросов полей.

Например:

articles = ModelChoiceField(queryset=Articles.objects.all(),
        to_field_name='slug')
1 голос
/ 22 марта 2012

Если postal_code - это внешний ключ для модели PostalCode, который содержит действительные почтовые индексы, я бы просто использовал CharField, а затем выполнил очистку, как вы предложили.Мой метод очистки будет выглядеть так:

def clean_postal_code(self):
    try:
        code = PostalCode.objects.get(code_field=self.data['postal_code'])
    except:
        raise forms.ValidationError("Please enter a valid postal code")
    return code
0 голосов
/ 22 марта 2012

ModelChoiceFields предназначены для выбора между выбором существующих экземпляров модели. Это почти всегда лучше всего представляется какой-либо формой поля Select.

Это говорит о том, что у вас действительно есть FK от адреса к postal_code, как вы намекаете. Что вы храните в таблице PostalCode, чтобы оправдать дополнительную таблицу, которую необходимо объединить для каждого запроса, относящегося к адресу?

В большинстве случаев postal_code должен быть просто CharField, и в этом случае, если вы хотите проверить, является ли значение допустимым, вы можете использовать атрибут choices со списком допустимых почтовых индексов. Имейте в виду, что ведение списка действительных почтовых индексов вручную - огромная проблема.

Если у вас действительно есть таблица PostalCode и вы думаете, что это хорошая идея (а в некоторых случаях это может быть), вы можете рассмотреть возможность фактического использования postal_code в качестве первичного ключа, а не автоинкремента по умолчанию, поскольку он обязательно уникален, что делает данные более экспортируемы и решают вашу проблему с проверкой.

...