Как сделать поле необязательным django

Добавил пользователь Алексей Ф.
Обновлено: 10.09.2024

Предполагая, что вы хотите сделать last_name необязательным, вы можете использовать атрибут blank :

Обратите внимание , что в CharField и TextField вы, вероятно, не захотите устанавливать null (см. Этот ответ для обсуждения причин), но в других типах полей вам это потребуется, иначе вы не сможете сохранить экземпляры, в которых опущены необязательные значения.

Вы используете аргумент required , отправленный со значением False :

Если вы хотите разрешить пустые значения в поле даты (например, DateField , TimeField , DateTimeField ) или числовом поле (например, IntegerField , DecimalField , FloatField ), вам нужно будет использовать как null=True , так и blank=True .

Используйте null=True и blank=True в своей модели.

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

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

Как установить атрибуты динамически для поля формы в форме Django? Прямо сейчас я могу использовать follwing для фиксированного атрибута. time_record =.

У меня есть класс формы Django с примерно 8 полями. Как мне динамически сделать все эти поля формы скрытыми в одном из моих представлений? Образец: class FormName(forms.Form): first_name =.

Как я могу сделать обязательные поля необязательными, если другое [связанное] поле имеет определенное значение? Предположим, у меня есть следующие модели: class foo(models.Model): bar =.

У меня есть модель (приложение), привязанная к таблице foreign_key (Person). У меня были проблемы с получением выпадающего списка Person-dropdown в admin для сортировки по имени, а не по ключу, и я.

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

У меня есть форма поиска Django с необязательными полями. Если это поле используется, оно должно быть проверено в clean_ . Однако я продолжаю получать ошибку '>' not supported between.

Последним, что нам стоит сделать для нашего веб-сайта, является удобный способ добавления и редактирования записей. admin -панель Django удобна, но её дизайн сложно изменять. С forms (формами) у нас будет абсолютная власть над интерфейсом блога — мы сможем сделать практически всё, что только можно придумать!

Формы Django удобны тем, что мы можем создать новую форму с нуля или воспользоваться ModelForm для сохранения содержимого формы в модель.

Это как раз то, что нам нужно сделать: мы создадим форму для модели Post .

Как и любая важная часть Django, формы имеют свой собственный файл: forms.py .

Нам нужно создать файл с таким именем в директории blog .

Теперь открой его и набери следующее:

Для начала нам нужно импортировать формы Django ( from django import forms ) и, разумеется, нашу модель Post ( from .models import Post ).

PostForm , как ты, вероятно, подозреваешь, — это имя для нашей формы. Нам нужно также сообщить Django, что эта форма относится к ModelForm (чтобы он смог поколдовать для нас) — forms.ModelForm поможет с этим.

Дальше у нас class Meta , где мы определяем, какая модель будет использоваться для создания формы ( model = Post ).

В завершение мы можем указать, какие поля должны присутствовать в нашей форме. Сейчас нам требуются только поля title и text — author будет автоматически выбран в зависимости от авторизованного пользователя (тебя), а created_date должна автоматически проставляться в момент создания записи (т.е. через код), верно?

Вот и всё! Теперь мы можем использовать форму в представлении и отобразить её в шаблоне.

Поэтому снова нам необходимо создать ссылку на страницу, URL-адрес, представление и шаблон.

Ссылка на страницу с формой

Пришло время открыть файл blog/templates/blog/base.html . Мы добавим ссылку в элемент div с именем page-header :

Обрати внимание, что мы назвали новое представление post_new . Класс glyphicon glyphicon-plus определён в используемой нами теме bootstrap — таким образом мы выведем значок плюса.

После добавления строки твой html-файл должен выглядеть следующим образом:

Нам нужно открыть файл blog/urls.py и добавить строку:

Окончательная версия файла будет выглядеть следующим образом:

После перезагрузки веб-сайта мы увидим ошибку AttributeError , поскольку представление post_new не реализовано. Давай добавим его прямо сейчас.

Представление post_new

Самое время открыть файл blog/views.py и добавить следующую строку к остальным, начинающимся с from :

А затем наше представление:

Чтобы создать новую форму Post , нам потребуется вызвать PostForm() и передать её шаблону. Мы ещё вернёмся к этому представлению, а пока давай быстро создадим шаблон под форму.

Шаблон

Нам нужно создать файл post_edit.html в директории blog/templates/blog . Чтобы заставить форму работать, нам потребуется несколько вещей:

  • Нам нужно отобразить форму. Мы можем сделать это, к примеру, простым > .
  • Строка выше должна быть обёрнута в HTML-теги
  • Нам потребуется кнопка Save . Мы добавим её при помощи HTML-кнопки: Save
  • И, наконец, сразу после открытия тега мы должны добавить . Это очень важно, поскольку так мы делаем форму защищённой! Django будет ругаться, если ты забудешь добавить этот код:

Хорошо, давай посмотрим, как должен выглядеть HTML-код в файле post_edit.html :

Время обновить страницу! Ура! Форма отображается!

Новая форма

Но подожди минутку! Если ты наберёшь что-нибудь в полях title и text и попробуешь сохранить — что произойдёт?

Ничего! Мы снова на той же странице и наш текст пропал. и новая запись не была добавлена. Так что же пошло не так?

Ответ прост: ничего. Нам нужно сделать кое-что ещё, чтобы новое представление заработало.

Сохраняем данные из формы

Снова открой файл blog/views.py . Всё, что у нас есть в представлении post_new , выглядит пока следующим образом:

После отправки формы мы возвращаемся к тому же представлению, но в этот раз с новыми данными в request , а точнее, в request.POST (имя POST не имеет ничего общего с "постом" в блоге, оно связано с тем, что мы "публикуем" данные). Помнишь, что в HTML-файле определение имеет параметр method="POST" ? Все поля формы теперь находятся в request.POST . Ты не должна переименовывать POST во что-то другое (другое доступное значение параметра method — GET , но у нас сейчас нет времени объяснять разницу).

Получается, что в представлении view нам нужно обработать две разные ситуации. Первая: когда мы только зашли на страницу и хотим получить пустую форму. Вторая: когда мы возвращаемся к представлению со всей информацией, которую мы ввели в форму. Таким образом, нам потребуется ввести условие (для этого мы будем использовать условный оператор if ):

Теперь заполним строку, занятую [. ] . Если method — POST , тогда мы хотим построить PostForm с данными из формы, верно? Мы добьёмся этого следующим образом:

Легко! Дальше мы проверим, корректна ли форма (все ли необходимые поля заполнены и не отправлено ли некорректных значений). Мы сделаем это при помощи form.is_valid() .

Мы проверяем, допустимо ли содержимое формы, и, если всё в порядке, сохраняем её!

Фактически мы выполняем две операции: сохраняем форму form.save и добавляем автора (поскольку обязательного поля author нет в PostForm !). commit=False означает, что мы пока не хотим сохранять модель Post — сначала нужно добавить автора. В основном ты будешь использовать form.save() , без commit=False , но в данном случае нам это пригодится. post.save() сохранит изменения (после добавления автора), и новая запись будет создана!

Наконец, будет прекрасно, если мы сможем сразу переходить к странице post_detail после добавления новой записи, согласна? Для этого нам понадобится еще один импорт:

Добавь эту строку в начало файла. Теперь мы можем сделать переадресацию на страницу post_detail для созданной записи:

post_detail — это имя представления, которое нам необходимо. Помнишь, что это представление требует переменную pk ? Чтобы передать её представлению, мы используем аргумент pk=post.pk , где post — это новая запись в блоге!

Хорошо, мы многое обсудили, пора взглянуть на представление полностью, верно?

Возможно, ты заметила, что мы устанавливаем дату публикации перед сохранением поста. В последствии мы сделаем кнопку публикации в Django Girls Tutorial: Extensions.

Ошибка при выходе из аккаунта

Валидация формы

Теперь мы покажем тебе, насколько круты формы в Django. Запись в блоге должна иметь поля title и text . В нашей модели Post мы не указываем, что эти поля необязательны (в отличие от published_date ), так что Django по умолчанию будет ожидать, что пользователь их заполнит.

Попробуй сохранить форму с незаполненными полями title и text . Угадай, что произойдёт!

Валидация формы

Django заботится о проверке всех полей в нашей форме на корректность. Разве не шикарно?

Форма редактирования

Теперь мы знаем, как добавить новую форму. Но что, если мы хотим внести исправления в уже существующую запись? По сути это схожая с предыдущей задача. Давай быстро создадим пару важных вещей (если ты чего-то не понимаешь, спроси своего тренера или загляни в предыдущие главы, поскольку мы уже объясняли все необходимые шаги).

Открой blog/templates/blog/post_detail.html и добавь следующую строку:

так, чтобы шаблон выглядел следующим образом:

В файле blog/urls.py добавь:

Мы будем использовать повторно шаблон blog/templates/blog/post_edit.html , так что осталось лишь отсутствующее представление.

Давай откроем файл blog/views.py и добавим в самый конец следующее:

Выглядит практически идентично представлению post_new , верно? Но не совсем. Во-первых, мы передаём параметр pk из URL-адреса. Кроме того, мы получаем модель Post для редактирования при помощи get_object_or_404(Post, pk=pk) и передаём экземпляр post в качестве instance форме и при сохранении…

… и когда мы открываем форму для редактирования:

Хорошо, давай удостоверимся, что всё работает! Перейди на страницу post_detail . Ты должна увидеть кнопку редактирования в правом верхнем углу:

Когда ты её нажмёшь, то увидишь форму с выбранной записью:

Форма редактирования

Поменяй заголовок и текст, а затем сохрани запись!

Поздравляем! Твое приложение становится всё более сложным!

Безопасность

Круто иметь возможность создавать новые посты, просто перейдя по ссылке! Однако сейчас кто угодно из посетителей твоего сайта может создать новую запись в блоге, а это, скорее всего, совсем не то, чего бы тебе хотелось. Давай сделаем так, чтобы кнопка показывалась для нас, а не кого-либо ещё.

В файле blog/templates/blog/base.html найди page-header div и тег , который мы добавили ранее. Должно выглядеть примерно так:

Мы добавим сюда ещё один тег , чтобы ссылка показывалась только пользователям, вошедшим в админку. То есть пока что — только тебе! Измени тег , чтобы получилось так:

Из-за этого ссылка будет отправлена в браузер, только если запрашивающий страницу пользователь вошёл в систему. Это не обезопасит создание новых постов полностью, но для начала и это неплохо. Мы подробнее рассмотрим вопросы безопасности в дополнении к учебнику.

Помнишь иконку редактирования, которую мы добавили на страницу поста? Чтобы посторонние не смогли менять уже созданные посты, нам нужно изменить страничку похожим образом.

Открой файл blog/templates/blog/post_detail.html и найди такую строку:

Замени её на следующее:

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

И последнее: публикация!

Теперь давай посмотрим, как это будет работать на PythonAnywhere. Пришло время для очередного развёртывания!

  • Сначала нам нужно сделать commit и push нового кода в репозиторий GitHub:

(Не забудь подставить вместо свой поддомен на PythonAnywhere без угловых скобок.)

Когда у вас есть отношение "многие ко многим" ( related_name , а не through )), и вы пытаетесь использовать интерфейс администратора, вам необходимо ввести одно из отношений, хотя оно не должно существовать для вы должны создать первую запись.

Я создаю приложение, которое является организатором мероприятия. Представьте, что у нас были модели Event и Group , связанные с отношением "многие ко многим".

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

Если я работаю с базой данных через phpMyAdmin, я могу создать Group без регистрации Event , так как соединение между ними осуществляется только через отдельную таблицу, и на заданном уровне нет значения значения базы данных.

Как мне реализовать интерфейс администратора? Как сделать поле "много ко многим" необязательным в Django?

Когда у вас есть многие-ко-многим отношения ( related_name , а не через ) и вы пытаетесь использовать интерфейс администратора вы должны ввести одно из отношений, хотя он не должен существовать для вас, чтобы создать первую запись.

Я'м создает приложение, которое является организатором мероприятия. Представьте, у нас было событие и группа модели, связаны с Многие-ко-многим отношения.

Джанго related_name создает другую таблицу с показателями двух других таблиц. Но я не вижу причин, почему эта дополнительная таблица и к заполнению.

Если я работаю с базой данных через phpmyadmin я могу создать группу без регистрации событие , так как связь между ними только через отдельную таблицу, и нет данных в исполнительном значение на заданном уровне.

Как сделать в админке это реализовать? Как сделать многие-ко-многим поле необязательно в Django?

Сценарий: Я создаю экземпляр ModelForm и передаю его в шаблон, который отображает форму. При отправке POST код пытается выполнить поиск в базе данных по любому из заданных входов. Я не требую вводить все входные данные, как в модели. Мне просто нужно ввести один (или несколько, если пользователь желает выполнить поиск по И).

Вопрос: Как сделать любое из полей ModelForm необязательным, если в Модели это поле не является необязательным. Поле не является необязательным в модели, потому что у меня есть другая модель ModelForm, основанная на той же модели, где пользователь должен ввести все свои данные.

Читайте также: