2016-05-14 1 views
1

Установка пустой метки для поля выбора дает мне некоторые проблемы. Я просмотрел ответы, например, this, но это просто говорит о форме.Django пустая метка в поле выбора - no queryset

Предположим, у меня есть следующие модели:

class MyColorModel(models.Model): 
    BLUE = 'blue' 
    RED = 'red' 
    GREEN = 'green' 
    COLOR_CHOICES = (
     (BLUE, 'Blue'), 
     (RED, 'Red'), 
     (GREEN, 'Green')) 

    my_color = models.CharField(max_length=5, choices=COLOR_CHOICES, blank=True) 

И эта форма:

class MyColorForm(forms.ModelForm): 
    class Meta: 
     model = MyColorModel 
     fields = ['mycolor'] 

По умолчанию, это будет отображать поле выбора, с пустой ярлык установлен ----- -

У меня есть следующие опции для установки метки.

1) Изменить COLOR_CHOICES в моей модель к:

COLOR_CHOICES = (
    ('', '---Please select your color---'), 
    (BLUE, 'Blue'), 
    (RED, 'Red'), 
    (GREEN, 'Green'), 

2) Изменение COLOR_CHOICES в моей модели к:

COLOR_CHOICES = (
    (None, '---Please select your color---'), 
    (BLUE, 'Blue'), 
    (RED, 'Red'), 
    (GREEN, 'Green'), 

3) Добавьте следующий инициализации метод моя модель вид:

def __init__(*args, **kwargs): 
    super(MyColorForm, self).__init__(*args, **kwargs) 
    self.fields['my_color'].choices = [('', '---Please select your color---')] + MyColorModel.COLOR_CHOICES 

Варианты 1 привели к некоторым побочным эффектам, где, если заявления, которые я начал неудачу, это то, что привело меня к созданию Вариант 2.

ли это нормально добавив пустой ярлык для моей модели (вариант 2)? Любые побочные эффекты, если я добавлю его там, или лучше добавить его в форму? Мне просто кажется, что достаточно кода просто установить пустую метку, когда я делаю это в форме.

ответ

1

Настройка того, что вы хотите в форме, является более правильным способом достижения желаемого результата. В Django модели содержат основные поля и поведение хранящихся вами данных. Тем не менее, они определяют, как ваша информация структурирована в базе данных.

1. Я не проверял, но ваш первый вариант
COLOR_CHOICES = (
    ('', '---Please select your color---'), 
    (BLUE, 'Blue'), 
    (RED, 'Red'), 
    (GREEN, 'Green'), 

my_color = models.CharField(max_length=5, choices=COLOR_CHOICES) 

может не работать, так как ваш первый выбор является пустая строка, но ваше my_color поле не содержит blank=True аргумент. Это означает, что он не позволит сохранить пустую строку в базе данных. Но в случае, если вы хотите, чтобы это поле было обязательным, тогда ваше определение пустого выбора не должно быть здесь, так как оно не приносит никакого добавленного значения, поскольку оно не содержит никакой дополнительной информации о вашей структуре данных.

2. Ваш второй вариант, безусловно, не путь [1]:

Избегайте использования нуль на основе строки, таких областях, как CharField и TextField, так как пустые строковые значения всегда будут сохранены как пустые строки, а не как NULL. Если в строковом поле есть null = True, это означает, что у него есть два возможных значения для «no data»: NULL и пустая строка. В большинстве случаев избыточно иметь два возможных значения для «нет данных», соглашение Django - использовать пустую строку, а не NULL.

3. Ваш третий вариант выглядит хорошо.Я не работал какое-то время с формами django, но если ваш код работает, форма является более подходящим местом для определения того, как должна выглядеть ваша форма, чем делать это в ваших моделях, поэтому идите для этой опции.

Или взгляните на решения из вопроса SO, связанные с вашим сообщением, и выполните их.

Удачи вам!

+0

Спасибо! Вы правы, мне нужно пусто = Истина там для варианта 1. Я собирался для варианта 2, но я обязательно буду использовать один из других сейчас – Johan

1

Итак, вы хотите установить empty_label для всех моделей Форм, созданных на вашем? Добавление пустой опции в вариантах прекрасное, ее даже указано в docs.

Если пустой = False не устанавливается на поле вместе с дефолтом то ярлыка, содержащий «---------» будет оказан с полем выбора. Для переопределите это поведение, добавьте кортеж в варианты, содержащие None; например (Нет, «Ваша строка для отображения»). В качестве альтернативы вы можете использовать пустую строку вместо None, где это имеет смысл - например, на CharField.

Но для того, чтобы остановить показ по умолчанию, вам необходимо установить blank=False. Так дайте попробовать что-то вроде этого:

class MyColorModel(models.Model): 
    BLUE = 'blue' 
    RED = 'red' 
    GREEN = 'green' 
    COLOR_CHOICES = (
     ('', '---Please select your color---') 
     (BLUE, 'Blue'), 
     (RED, 'Red'), 
     (GREEN, 'Green')) 

    my_color = models.CharField(max_length=5, choices=COLOR_CHOICES, blank=False, null=False, default='') 

Но на мой взгляд, лучший способ сделать это просто установить empty_label на form.field.

def __init__(*args, **kwargs): 
    super(MyColorForm, self).__init__(*args, **kwargs) 
    self.fields['my_color'].empty_label = '---Please select your color---' 
+0

Спасибо за ответ. Я также предпочитаю устанавливать пустую метку, как вы сделали в качестве последней опции, но похоже, что это работает только тогда, когда поле модели является полем ForeignKey (например, поле modelchoicefield). Для меня установка пустой метки в обычном поле выбора не имеет эффекта (с использованием Django 1.9) – Johan

+0

Я читал это в документах, поэтому я перехожу к опции 1: если пустое поле = False установлено в поле вместе с по умолчанию, тогда ярлык, содержащий «---------», будет отображаться с помощью поля выбора. Чтобы отменить это поведение, добавьте кортеж в варианты, содержащие None; например (Нет, «Ваша строка для отображения»). В качестве альтернативы вы можете использовать пустую строку вместо None, где это имеет смысл - например, на CharField. – Johan

Смежные вопросы