Форсировать поля модели в Django - PullRequest
0 голосов
/ 04 апреля 2020

При создании модели в Django, как в этом примере:

class Musician(models.Model):
    first_name = models.CharField(max_length=50, primary_key=True)
    last_name = models.CharField(max_length=50)
    instrument = models.CharField(max_length=100)

Я заметил некоторую проблему (не уверен, что это лучшее слово) с этим подходом. Ничто не мешает вам создать что-то вроде:

musician = Musician()
musician.save()

, имеющее значение primary_key, равное None. Я хотел бы заставить пользователя установить first_name, но, честно говоря, я не могу найти никакого простого решения для этого.

Есть ли способ достичь этого?

1 Ответ

2 голосов
/ 04 апреля 2020

Прежде всего, не установить first_name в качестве первичного ключа. Просто оставьте первичный ключ по умолчанию как поле id. Первичный ключ должен быть уникальным (а не first_name) и не должен быть чем-то, что вводит пользователь.

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

Фактически, Django делает это автоматически для вас, в твоем случае. По умолчанию first_name является полем required, так как вы не установили blank=True.

Так что если вы сделаете:

musician = Musician()
musician.full_clean()

, это вызовет ValidationError.

Если вы создаете форму для своей модели (это то, что вам нужно, если вы хотите, чтобы пользователи создавали Musician):

class MusicianForm(ModelForm):
    class Meta:
        model = Musician
        fields = '__all__'

form = MusicianForm(data={})
form.instance.first_name
# ''
form.is_valid()
# False
form.save()
# ValueError: The Musician could not be created because the data didn't validate.

Вы также увидите это, если зарегистрируетесь Musician в admin.py для django сайта администратора, вы не можете оставить ни одно из полей пустым. Это просто не спасет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...