Есть ли способ заставить USStateField () Django не иметь предварительно выбранного значения? - PullRequest
9 голосов
/ 02 декабря 2009

Я использую USStateField () из localflavor Django в одной из моих моделей:

class MyClass(models.Model):
   state  = USStateField(blank=True)

Тогда я сделал форму из этого класса:

class MyClassForm(forms.ModelForm):
    class Meta:
        model   = MyClass

Когда я отображаю форму, поле «Состояние» представляет собой раскрывающийся список с «Алабама» предварительно выбрана.

Есть ли способ сделать выпадающий список, чтобы не показывать предварительно выбранный значение вообще?

Ответы [ 5 ]

9 голосов
/ 02 декабря 2009

Кажется, это известная проблема (хотя я не знаю о билете - я бы дважды проверил, что для него нет билета, и если нет, подайте его ):

from django.contrib.localflavor.us.us_states import STATE_CHOICES
from django.contrib.localflavor.us.forms import USStateField

class YourModelForm(forms.ModelForm):
    class Meta:
        ...

    YOUR_STATE_CHOICES = list(STATE_CHOICES)
    YOUR_STATE_CHOICES.insert(0, ('', '---------'))
    state = USStateField(widget=forms.Select(
            choices=YOUR_STATE_CHOICES))

Выше кода от здесь .

3 голосов
/ 10 марта 2015

Просто сообщаю, что это исправлено! Также обратите внимание, что localflavor - это , теперь сторонний пакет и после установки (например, pip install django-localflavor) его можно использовать так:

from localflavor.us.us_states import STATE_CHOICES
from localflavor.us.models import USStateField


class MyClass(models.Model):
    state = USStateField(choices=STATE_CHOICES)
3 голосов
/ 25 января 2010

Мне не очень нравится идея вставки ----- в список вручную. Если для поля установлено значение blank = True, параметр пробела должен автоматически отображаться в верхней части списка выбора. Кроме того, если ваше поле состояния находится в «Профиле» и вы используете профили django, то вам придется изменить приложение многократного использования.

Мне проще и проще скопировать кортеж STATE_CHOICES из файла contrib / localflavor / us / us_states.py в constants.py в моем проекте, а затем в models.py:

import constants
state = models.CharField(blank=True, max_length=2, choices=constants.STATE_CHOICES) 

Параметр blank = True будет работать, как и ожидалось, без необходимости монтирования списка.

2 голосов
/ 25 сентября 2015

Простое решение:

from localflavor.us.us_states import STATE_CHOICES


STATE_CHOICES = (('', '---------'),) + STATE_CHOICES
1 голос
/ 09 марта 2010

Кажется, что следующий хак работает и в админке django, и в формах, определенных в представлениях:

from django.contrib.localflavor.us.us_states import STATE_CHOICES
USStateField.choices = STATE_CHOICES

Дело в том, что определение forms.py в contrib / localflavor / us / forms.py имеет виджет USStateSelect, который определяет выбор как STATE_CHOICES. Однако модель в contrib / localflavor / us / models.py не определяет эти варианты. Таким образом, пусто = истинные настройки для поля не приводят к правильной первой пустой записи в Select, я узнал, глядя на db / models / fields / init .py.

Альтернативное решение - изменить contrib / localflavor / us / models.py и добавить конструктор, подобный этому:

class USStateField(Field): 
    def __init__(self, *args, **kwargs):
        from us_states import STATE_CHOICES
        kwargs.setdefault('max_length', 2)
        kwargs.setdefault('choices', STATE_CHOICES)
        super(USStateField, self).__init__(*args, **kwargs)
    # etc. etc.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...