Модель Django НЕ обов’язкове поле


Відповіді:


98

Вгадайте, ваша модель така:

class My_Class(models.Model):

    address = models.CharField()

Ваша форма для версії Django <1.8:

class My_Form(ModelForm):

    address = forms.CharField(required=False)

    class Meta:
        model = My_Class
        fields = ('first_name', 'last_name' , 'address')

Ваша форма для версії Django> 1.8:

class My_Form(ModelForm):

    address = forms.CharField(blank=True)

    class Meta:
        model = My_Class
        fields = ('first_name', 'last_name' , 'address')

3
А як щодо поля зовнішнього ключа?
digz6666

18
Використовуйте ModelChoiceField. Отже, якщо визначення полів є abc=models.ForeignKey(Abc), ви можете написатиabc = forms.ModelChoiceField(queryset=Abc.objects.all(), required=False)
Акшар Раадж

2
Переконайтеся, що форми імпортовано, якщо ви раніше їх не використовували:from django import forms
Джастін МакКендлесс

Ви впевнені, що Django> 1.8 повинен прийняти blank=True? Документи говорять інакше, і моєму коду це не подобається, вони кажуть, що я повинен використовувати required=False. Ви перевернули ваші знаки?
Лука Безерра,

109
class My_Form(forms.ModelForm):
    class Meta:
        model = My_Class
        fields = ('first_name', 'last_name' , 'address')

    def __init__(self, *args, **kwargs):
        super(My_Form, self).__init__(*args, **kwargs)
        self.fields['address'].required = False

3
Хоча відповідь акшара виглядає краще, цей метод запобігає тому, що вам потрібно робити щось, щоб встановити такі речі, як help_text та label.
Blackeagle52,

3
Цей метод особливо корисний при роботі з полями, які визначаються як FK на рівні моделі. За методом Акшара потрібно було б встановити querysetатрибут.
PritishC


7

Вам слід додати:

address = forms.CharField(required=False)

4
Порожній та нульовий атрибути не використовуються для ModelForms
Фернандо Феррейра

3
це має бути в полі моделі , а не в полі форми. null=True, blank=Trueспричинить поле required=False
ModelForm

3

Рішення @ Anentropic з коментаря до відповіді @ Atma спрацювало для мене. І я думаю, що це теж найкращий.

Його коментар:

null = True, blank = True призведе до того, що поле ModelForm буде обов'язковим = False

Я просто встановив його на своєму полі ManyToMany у своєму UserProfileкласі, і він працював бездоганно.

Мій UserProfileклас зараз виглядає так (зауважте friendsполе):

class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    friends = models.ManyToManyField('self', null=True, blank=True)

Я також думаю , що це найкрасивіше рішення , так як ви робите те ж саме, покласти nullі blankдо True, погода у вас є просте charполе або, як у мене є, ManyToManyполе.

Знову ж таки, дякую багато @Anentropic. :)

PS Я написав це як допис, оскільки не міг коментувати (у мене менше 50 репутації), але й тому, що, на мою думку, його коментар потребує більшого викриття.

PPS Якщо ця відповідь допомогла вам, будь ласка, підтримайте його коментар.

На ура :)


3

Рішення: використовувати обидва blank=True, null=True.

my_field = models.PositiveIntegerField(blank=True, null=True)

Пояснення:

якщо ви використовуєте null=True

`my_field = models.PositiveIntegerField(null=True)`

тоді потрібно поле my_field, з * проти нього у формі, ви не можете подавати порожнє значення.

якщо ви використовуєте blank=True

`my_field = models.PositiveIntegerField(blank=True)`

тоді my_field не потрібно, ні * проти нього у формі, ви не можете подати значення. Але отримання нульового поля заборонено.

Примітка:

1) marking as not required and 
2) allowing null field are two different things.

Порада професіонала:

Read the error more carefully than documentation.

0

Наведені вище відповіді є правильними; тим не менш належним чином зауважте, що налаштування null=Trueна ManyToManyField не впливає на рівень бази даних і під час міграції викликатиме таке попередження:

(fields.W340) null has no effect on ManyToManyField.

Хороша відповідь на це пояснюється в цій іншій темі .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.