Почему этот код компилируется?

Вчера вечером, будучи слишком уставшим, я написал эту странную строку:

::TerminateThread(::TerminateThread, 0);

К моему удивлению, ) class Car (models.Model): name = models.CharField (max_length = 20) color = models.CharField (...

Предполагая, что у меня есть такая модель

COLORS= (
    ('R', 'Red'),
    ('B', 'Yellow'),
    ('G', 'White'),
)
class Car(models.Model):
    name = models.CharField(max_length=20)
    color= models.CharField(max_length=1, choices=COLORS)

Она отображается как поле выбора в панели администратора, однако я хотел бы, чтобы мой администратор-пользователь несколько раз выбирал эти цвета, например, отношение «многие ко многим», как этого можно достичь без логики типа ('RB', 'Red & Blue'),

10
задан Serjik 14 November 2015 в 05:07
поделиться

3 ответа

Может ли Автомобиль иметь несколько цветов? В этом случае цвет должен быть отношением многие ко многим, а не CharField. Если, с другой стороны, вы хотите сделать что-то вроде разрешений Unix (т.е. красный + синий, красный + синий + зеленый и т. д.), то присвойте каждому из них числовые значения и сделайте цвет. ] целочисленное поле .

Обновление

(После прочтения комментария) Вы можете использовать пользовательскую форму для редактирования вашей модели в Admin вместо стандартной ModelForm. Эта настраиваемая форма может использовать виджет множественного выбора, который позволяет пользователям выбирать несколько цветов. Затем вы можете переопределить метод clean() формы для возврата подходящего конкатенированного значения («RB» и т. д.).

Обновление 2

Вот код:

Во-первых, удалите выбор из поля модели. Также увеличьте его максимальный размер до 2. Здесь нам не нужны варианты выбора — если они будут, нам придется добавить выбор для каждой комбинации цветов.

class Car(models.Model):
    ...
    color= models.CharField(max_length=2)

Во-вторых, добавьте пользовательскую ModelForm для использования в приложении администратора.Эта форма переопределит цвет и вместо этого объявит его как поле множественного выбора. Здесь нам действительно нужен выбор.

COLORS= (
    ('R', 'Red'),
    ('B', 'Yellow'),
    ('G', 'White'),
)

class CarAdminForm(ModelForm):
    color = forms.MultipleChoiceField(choices = COLORS)

    class Meta:
        model = Car

    def clean_color(self):
        color = self.cleaned_data['color']
        if not color:
            raise forms.ValidationError("...")

        if len(color) > 2:
            raise forms.ValidationError("...")

        color = ''.join(color)
        return color

Обратите внимание, что я добавил только пару проверок. Вы можете захотеть больше и/или настроить проверки.

Наконец, зарегистрируйте эту форму у администратора. Внутри вашего admin.py:

class CarAdmin(admin.ModelAdmin):
    form = CarAdminForm

admin.site.register(Car, CarAdmin)
11
ответ дан 3 December 2019 в 21:19
поделиться

Для кортежа цветов, если вы используете целые числа вместо символов, вы можете использовать для своей модели целочисленное поле, разделенное запятыми. Но не забывайте, целочисленное поле, разделенное запятыми, является структурой уровня базы данных, поэтому ваша СУБД должна его поддерживать.

Ссылка на документацию...

1
ответ дан 3 December 2019 в 21:19
поделиться

Используйте отдельную таблицу с цветами (Красный, Синий, Зеленый) и, как вы сказали, добавить отношения многие ко многим? Тип выбора — это не множественный выбор, а только строка с добавленным интерфейсом и проверками.

Или сгенерируйте процедурно свои варианты с помощью itertools.combinations, например:

choices = zip(
  [''.join(x) for x in itertools.combinations(['','B','R','G'],2)],
  [' '.join(x) for x in itertools.combinations(['','Blue','Red','Green'],2)],
)

 # now choices = [(' Blue', 'B'), (' Red', 'R'), (' Green', 'G'), ('Blue Red', 'BR'), ('Blue Green', 'BG'), ('Red Green', 'RG')]
1
ответ дан 3 December 2019 в 21:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: